Laravel удаляет родительскую коллекцию, если она связана

#laravel #eloquent

#laravel #красноречивый

Вопрос:

У меня есть модель со связанной коллекцией

теперь я выполняю этот запрос

         $data = DeliveryPartner::when($filter, function ($q) use ($request) {
        })
        ->with(['orders' => function ($query) {
            $query
                  ->where('delivery_partner_invoice_id', '=', '')
                  ->orWhereNull('delivery_partner_invoice_id')
                  ->whereIn('status', ['payment-accepted', 'completed', 'full-refund', 'partial-refund']);
        }])->get();
  

Теперь мне интересно. Если orders возвращает пустой, возможно ли удалить этого родителя из коллекции?

Я знаю, что могу сделать это после запроса eloquent с циклом. Но возможно ли это сделать в запросе?

Ответ №1:

мы не можем полностью удалить эту родительскую коллекцию (с индексом), НО вы можете установить их, null используя transform() следующим образом;

     $data = DeliveryPartner::when($filter, function ($q) use ($request) {
        })
        ->with(['orders' => function ($query) {
            $query
                  ->where('delivery_partner_invoice_id', '=', '')
                  ->orWhereNull('delivery_partner_invoice_id')
                  ->whereIn('status', ['payment-accepted', 'completed', 'full-refund', 'partial-refund']);
        }])->get()->transform(function($item){

                if(!$item->orders->count() ){
                    return;
                }
                return $item;
        });
  

Примечание: это не приведет к полному удалению этих родительских элементов, но установит их пустыми.

Комментарии:

1. Вы также можете объединить их в цепочку ->filter()->values() для фильтрации нулевого значения, после чего возвращает новую коллекцию со сброшенными ключами