Laravel - Красноречивый "Имеет", "С", "WhereHas" - Что это значит?

Я нашел концепцию и смысл этих методов немного запутанными, возможно ли кому-то объяснить мне, какая разница между has и with, в контексте примера (если возможно)?

Ответ 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