Я нашел концепцию и смысл этих методов немного запутанными, возможно ли кому-то объяснить мне, какая разница между has
и with
, в контексте примера (если возможно)?
Laravel - Красноречивый "Имеет", "С", "WhereHas" - Что это значит?
Ответ 1
С
with()
для загруженной. Это в основном означает, что по основной модели Laravel предварительно задает указанные вами отношения (отношения). Это особенно полезно, если у вас есть коллекция моделей, и вы хотите загрузить соотношение для всех из них. Поскольку при активной загрузке вы запускаете только один дополнительный запрос БД вместо одного для каждой модели в коллекции.
Пример:
User > hasMany > Post
$users = User::with('posts')->get();
foreach($users as $user){
$users->posts; // posts is already loaded and no additional DB query is run
}
Имеет
has()
заключается в фильтрации выбранной модели на основе отношения. Таким образом, он действует очень похоже на нормальное условие WHERE. Если вы просто используете has('relation')
, это означает, что вы хотите получить только модели, имеющие по крайней мере одну связанную модель в этом отношении.
Пример:
User > hasMany > Post
$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection
WhereHas
whereHas()
работает в основном так же, как has()
, но позволяет указать дополнительные фильтры для соответствующей модели для проверки.
Пример:
User > hasMany > Post
$users = User::whereHas('posts', function($q){
$q->where('created_at', '>=', '2015-01-01 00:00:00');
})->get();
// only users that have posts from this year are returned