Laravel работа с вложенной коллекцией удалить вложенную ветку - PullRequest
1 голос
/ 06 августа 2020

невозможно удалить все вложенные ветки, где "product" => null Есть запрос

$cartWhere['user_id'] = $user_id;
$cartWhere['site_id'] =$currentSite->id;

$item = Cart::select('product_id','quantity')->with(['product' => function($product) use ($search){
$product->join('product_translations', 'products.id', '=', 'product_translations.product_id');
$product->where( 'product_translations.name', 'LIKE','%'.$search.'%');
        },'product.manufacturer:id,name'])
->where($cartWhere)->get();

, тогда я получаю коллекцию, в которой есть все отфильтрованные корзины, но некоторые из этих корзин связаны с product => null

  1 => App\Models\Cart {#736 ▼
      ...
      #original: array:2 [▼
        "product_id" => 1
        "quantity" => 2
      ]
     ...
      #relations: array:1 [▼
        "product" => App\Models\Product {#785 ▶}
      ]
  }
  2 => App\Models\Cart {#736 ▼
      ...
      #original: array:2 [▼
        "product_id" => 2
        "quantity" => 2
      ]
     ...
      #relations: array:1 [▼
        "product" => null
      ]
  }

извините за мой Engli sh

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Их можно отфильтровать из результатов с помощью коллекций filter () method

$item = Cart::select('product_id','quantity')
            ->with(['product' => function($product) use ($search) {
                $product->join('product_translations', 'products.id', '=', 'product_translations.product_id');
                $product->where( 'product_translations.name', 'LIKE','%'.$search.'%');
            }, 'product.manufacturer:id,name'])
           ->where($cartWhere)
           ->get()
           ->filter(function ($cart) {
               return $cart->product !== null;
           });
0 голосов
/ 06 августа 2020

Наряду с with вы должны использовать whereHas. Таким образом, результат не будет включать никакой связи со значением null. Таким образом, вы также можете избежать использования лишнего метода filter.

...