У меня есть две таблицы, User
и Post
. У одного User
может быть много, posts
а у одного post
- только один user
.
В моей User
модели у меня есть hasMany
отношение ...
public function post(){
return $this->hasmany('post');
}
И в моей post
модели у меня есть belongsTo
отношение ...
public function user(){
return $this->belongsTo('user');
}
Теперь я хочу объединить эти две таблицы, используя Eloquent with()
отдельные столбцы из второй таблицы. Я знаю, что могу использовать Query Builder, но не хочу.
Когда в Post
модели я пишу ...
public function getAllPosts() {
return Post::with('user')->get();
}
Он запускает следующие запросы ...
select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)
Но то, что я хочу, это ...
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
Когда я использую ...
Post::with('user')->get(array('columns'....));
Возвращает только столбец из первой таблицы. Я хочу использовать конкретные столбцы with()
из второй таблицы. Как я могу это сделать?
$query->select('id','username');
, я получалTrying to get property of non-object
id
в данном случае) необходим$query->select()
для фактического получения необходимых результатов. Я пропустил это в своем коде и не мог понять, почему он не даст никаких результатов. Я такой глупый! Надеюсь, что это поможет кому-то еще с той же проблемойВы можете сделать это так с Laravel 5.5:
Уход за
id
полем иforeign keys
как указано в документах :Например, если пользователь принадлежит команде и имеет
team_id
в качестве столбца внешнего ключа значение, то$post->user->team
пусто, если вы не укажетеteam_id
источник
get()
методеPost::with('user:id,username')->get(['age', 'color']);
В вашей
Post
моделиОригинальный кредит переходит к Laravel Eager Загрузка - Загрузка только определенных столбцов
источник
$fields
параметр.При переходе в другую сторону (hasMany):
Не забудьте включить внешний ключ (при условии, что в этом примере это user_id) для разрешения отношения, иначе вы получите нулевой результат для вашего отношения.
источник
В Laravel 5.7 вы можете называть определенное поле следующим образом
Важно добавить
foreign_key
поле в выделение.источник
В вашей
Post
модели:Теперь вы можете использовать
$post->userWithName
источник
Если вы хотите , чтобы получить определенные столбцы , используя
with()
в Laravel красноречивы , то вы можете использовать код , как показано ниже , который первоначально ответили @Adam в своем ответе здесь в ответ на этот же вопрос:Так что я использовал его в своем коде, но он выдавал ошибку
1052: Column 'id' in field list is ambiguous
, поэтому, если вы, ребята, тоже столкнулись с той же проблемойЗатем для ее решения необходимо указать имя таблицы перед столбцом id в
with()
методе, как показано ниже :источник
Я сталкивался с этой проблемой, но со вторым слоем связанных объектов. Ответ @Awais Qarni имеет место с включением соответствующего внешнего ключа во вложенный оператор выбора. Так же, как идентификатор требуется в первом вложенном операторе выбора для ссылки на связанную модель, внешний ключ необходим для ссылки на вторую степень связанных моделей; в этом примере модель компании.
Кроме того, если вы хотите выбрать конкретные столбцы из модели Post, вам нужно будет включить столбец user_id в оператор выбора, чтобы ссылаться на него.
источник
Обратите внимание, что если вам нужен только один столбец из таблицы, тогда использование списков - это неплохо. В моем случае я получаю любимые статьи пользователя, но мне нужны только идентификаторы статей:
Возвращает массив идентификаторов, например:
источник
toArray()
!!!$user->favourites->lists('id')->toArray();
$user->favourites
будет возвращеноCollection
со всеми выбранными полями. Правильное использование:$user->favourites()->lists('id')
.Query\Builder::lists
методом иCollection::lists
методом.Вы также можете указать столбцы на связанной модели во время доступа к ней.
Post::first()->user()->get(['columns....']);
источник
Теперь вы можете использовать
pluck
метод наCollection
экземпляре:Это вернет только
uuid
атрибутPost model
источник
Попробуйте с условиями.
источник
источник