Жаждет загрузить 3 отношения?

#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 в цикле … как только что-то загружено, оно загружается, зачем вам загружать это снова и снова?