2017-01-30 9 views
0

При вызове CollegeMajor::with('majors')->get() я хотел бы применить следующий необработанный запрос sql: TRIM(TRAILING SUBSTRING_INDEX(parent_id, ':', -1) FROM parent_id) к столбцу parent_id. Значения в parent_id хранятся как 1:1234, 1:3121, 1:1332 и т. Д. ... и поэтому поэтому я хотел бы удалить все после двоеточия. Первичным ключом для CollegeMajor является id, и эти значения являются целыми числами, такими как 1. Я получаю ошибку ниже, потому что Laravel считает, что сырой запрос - это имя столбца. Как сообщить Laravel о применении этого запроса sql к столбцу project_id при выполнении отношений?Laravel 5.2 Использование необработанного запроса при определении отношений, связанных с привязкой к модели?

CollegeMajor.php стол

class CollegeMajor extends Model { 
    public function majors() { 
    return $this->hasMany('App\Models\CollegeMajor', \DB::raw(TRIM(TRAILING SUBSTRING_INDEX(parent_id, ':', -1) FROM parent_id))) 
        ->where('entity', 'major'); 
    } 
} 

Ошибка

Unknown column 'college_major.TRIM(TRAILING SUBSTRING_INDEX(parent_id, ':', -1) FROM parent_id)' in 'where clause' (SQL: select * from `college_major` where `entity` = major and `college_major`.`TRIM(TRAILING SUBSTRING_INDEX(parent_id, ':', -1) FROM parent_id)` in (1, 2, 3, 4, 5, 6, 7, 8)) 

college_majors

id  name    entity parent_id 
1 College of Art  college  1234 
2 College of Business college  4567 
3 Art History   major  1:1234 
4 Asian Art   major  1:1234 
5 Accounting   major  2:4567 
6 Marketing   major  2:4567 

Как сделать это вернуть?

[ 
    id: 1, 
    name: 'College of Art', 
    entity: 'college', 
    parent_id: 1234, 
    majors: [ 
    { 
     id: 3, 
     name: 'Art History', 
     entity: 'major', 
     parent_id: '1:1234' 
    }, 
    { 
     id: 4, 
     name: 'Asian Art', 
     entity: 'major', 
     parent_id: '1:1234' 
    } 

    ] 
    .... 
] 

ответ

0

Второй параметр для hasMany() - это внешний ключ. Поэтому вы не можете определить свой запрос там. Определите свои отношения следующим образом.

public function majors() { 
    return $this->hasMany('App\Models\CollegeMajor'); 
} 

Тогда при запросе используйте raw expressions это.

CollegeMajor::with('majors') 
    ->select(DB::raw('TRIM(TRAILING SUBSTRING_INDEX(parent_id, ":", -1) FROM parent_id))') 
->where('entity', 'major')->get(); 

Еще не проверено. На моем телефоне :)

+0

Очень близко, я думаю. Я отредактировал свой вопрос. Коллекция - это то, чего я пытаюсь достичь. Какие-либо предложения? –

+0

Я обновил ответ, поскольку забыл добавить 'get()' в конце запроса. Затем он вернет коллекцию. – Gayan

+0

Мне пришлось сделать какое-то хакерское решение, где я получаю все результаты из таблицы, фильтрую результаты только колледжами, добавляю ключ «майоров» к каждому из этих предметов колледжа, затем прокручиваю каждую запись, а если ее майор, то Я прокручиваю каждый из предметов колледжа и выдвигаю его в колледж, к которому он принадлежит. На самом деле это изящное решение, но я думаю, что сейчас это будет сделано. –

 Смежные вопросы

  • Нет связанных вопросов^_^