Laravel - красноречивые слова «имеет», «с», «где» - что они имеют в виду?

79

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

Теги:
eloquent
orm
relationship
relational-database

1 ответ

219
Лучший ответ

С

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
  • 63
    +1, очень полезный ответ! Также обратите внимание, что хотя with('relation') будет включать данные связанной таблицы в возвращаемую коллекцию, has('relation') и whereHas('relation') не будут включать данные связанной таблицы. Таким образом, вам может потребоваться вызвать как with('relation') так и с has() или whereHas() .
  • 1
    Привет Ответ, Как получить доступ к родительской модели из модели отношений, например, здесь, как искать модель поста на основе атрибутов пользовательской модели
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню