#php #laravel #eloquent
#php #laravel #красноречивый
Вопрос:
У меня есть эти таблицы:
users | name - ...
carts | user_id - ...
cart_product | cart_id - product_id
отношения:
Cart model
public function products()
{
return $this->belongsToMany(Product::class)
->withPivot('quantity','coupon_id')
->withTimestamps();
}
User model:
public function cart()
{
return $this->hasOne(Cart::class);
}
когда я выполняю запрос, в запросе n 1 примерно так:
auth()->user()->cart()->with('products')->products
Как я могу нетерпеливо загружать запрос??
Комментарии:
1. user()->with(‘корзина.товары’)
2. Что вы получите, если напечатаете вот так
dd(auth())
? Дайте нам знать3. @EncangCutbray пользователь, который вошел в систему!
4. Попробуйте вот так
return auth()->loadMissing('cart.products')
дайте нам знать, если вы получите ошибку5. @EncangCutbray Вызывает неопределенное отношение [корзина] в модели [Приложение Модели Корзина].
Ответ №1:
Я полагаю, вам просто нужны продукты?
$products = auth()->user()->cart->products;
Это загрузит cart
отношения, затем products
для этой корзины. Он не будет запускать эти запросы более одного раза, так как у этого User
теперь загружено его cart
отношение (поэтому оно не будет загружено снова при доступе через динамическое свойство). У этого Cart
загружена его products
связь (которая не будет загружена снова при доступе через динамическое свойство).
Если вы действительно чувствуете, что хотите «лениво загрузить» эти отношения (что вам нужно будет посмотреть, отличается ли запрос от того, что он должен быть таким же, как доступ к нему через динамическое свойство), вы можете это сделать:
$products = auth()->user()->load('cart.products')->cart->products;
Комментарии:
1. В чем разница между load и loadMissing? потому что ошибка загрузки работает, но загрузка не выполняется!
2. laravel.com/docs/7.x/eloquent-relationships#lazy-eager-loading
3. похоже, что здесь нет причин для какой-либо отложенной загрузки, поэтому не уверен, почему вы думаете, что вам нужно
4. поскольку вы напрямую запрашивали отношения вместо использования динамического свойства и выполняли некоторые запросы в цикле … как только у вас есть эта коллекция продуктов, больше не к чему запрашивать, если вы сами не выполняете запросы
5. вы не вызываете
load
в цикле … как только что-то загружено, оно загружается, зачем вам загружать это снова и снова?