Я нашел концепцию и значение этих методов немного запутанными, возможно ли, чтобы кто-то объяснил мне, в чем разница между has
и with
в контексте примера (если это возможно)?
источник
Я нашел концепцию и значение этих методов немного запутанными, возможно ли, чтобы кто-то объяснил мне, в чем разница между has
и with
в контексте примера (если это возможно)?
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()
является фильтрация модели выбора на основе отношений. Так что он действует очень похоже на нормальное состояние ГДЕ. Если вы просто используете это, 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
with('relation')
будет включать данные связанной таблицы в возвращенную коллекциюhas('relation')
и неwhereHas('relation')
будет включать данные связанной таблицы. Таким образом, вам может понадобиться позвонить как, так и или .with('relation')
has()
whereHas()
whereHas
отношение пользователя при запросе поста.whereHas
он используетuse Illuminate\Database\Eloquent\Builder;
то, что сfunction(Builder $query)
. Большинство примеров, которые я видел, используют точкуBuilder
, просто передают запрос $, что является правильным способом?Документ уже объяснил использование. Поэтому я использую SQL для объяснения этих методов
Пример:
Предполагая, что
Order (orders)
есть многоOrderItem (order_items)
.И вы уже выстроили отношения между ними.
Эти три метода основаны на отношениях .
С участием
Результат:
with()
вернуть объект модели и связанные с ним результаты.Преимущество: это энергичная загрузка, которая может предотвратить проблему N + 1 .
Когда вы используете следующий Eloquent Builder:
Laravel изменить этот код только на два SQL :
И затем laravel объединить результаты второго SQL как отличные от результатов первого SQL путем внешнему ключу . Наконец верните результаты сбора.
Таким образом, если вы выбрали столбцы без Foreign_key в закрытии, результат отношения будет пустым:
имеет
Has
вернет объект модели, что ее отношение не пустое .Laravel измените этот код на один SQL :
whereHas
whereHas
иorWhereHas
методы наложенияwhere
условий на вашиhas
запросы. Эти методы позволяют добавлять настраиваемые ограничения в ограничение отношений .Laravel измените этот код на один SQL :
источник