Ларавель-красноречивое "имеет", "С", " где " - что они означают?


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

1 124

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() строительство в основном то же самое, что 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 2015 on forward are returned