2014-12-30 6 views
1

Рассмотрим этот код:Laravel Eloquent -> с() и -> выберите() конфликт друг с другом

Articles 
::select('article_id', 'article_text') //This one does not work as expected 
->with([ 
    'user' => function($q){ 
     $q->select('user_id', 'user_name'); // This one works fine 
    } 
]) 
->get(); 

При создании запроса в красноречивых, мы можем использовать -> с(), чтобы извлечь ассоциируемых моделей. Мы также можем присоединить -> select(), чтобы определить, какие столбцы следует выбирать из связанной модели. Однако похоже, что мы теряем возможность указывать, какие столбцы следует выбирать из базовой модели, которую мы запрашиваем.

В этом примере, из-за первого ::select, окончательные результаты, возвращаемые не включают user, потому что он не включен в список ::select. Если я включу его там, то он выдает ошибку около column not found. Красноречивый не достаточно умен, чтобы понять, что я имею в виду отношения, а не столбцы.

Можно ли указать, какие столбцы должны быть возвращены от user, а также от article?

+0

Ваше предположение немного неверно. Не имеет значения, что в первом 'select' нет' пользователя'. Это два отдельных запроса, поэтому на самом деле не имеет значения, что вы выбираете, если вы включите все задействованные ключи (ПК, FK) - как уже говорило @lagbox. –

ответ

1

Вы можете выбрать нужные столбцы с помощью загружаемых ограничений, но вам по-прежнему необходимо, по крайней мере, выбрать столбцы, которые используются для отношений.

Случайный пример:

User::with(['tickets' => function ($q) { 
    $q->select('user_id'); 
}])->select('id')->get(); 

Те минимальные поля, необходимые для того, чтобы возвращать результаты для отношений и они присоединены к соответствующим моделям.

Вам необходимо будет выбрать как минимум user_id от tickets и id от users. Это столбцы, используемые для этих отношений. tickets.user_id ->users.id

журнал запросов:

'select `id` from `users`' 

'select `user_id` from `tickets` where `tickets`.`user_id` in (....)' 

Имея эти поля дает вам то, что нужно для связи, чтобы возвращать результаты, теперь вы можете добавить дополнительные поля в этих выбирает.

Я надеюсь, что это поможет.

+0

Любая идея, почему этот код: $ orders = OrderHeader :: where ('created_by', $ this-> user-> id) -> with (['status' => function ($ q) { $ q- > select ('id', 'name'); }]) -> select ('id') -> get(); return nginx 502 ошибка. если я удаляю «select» или «with», он работает хорошо. – kbeat

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