Фильтровать коллекцию подсветки на основе пустоты дочерней коллекции

#php #laravel

#php #laravel

Вопрос:

Orders реализует сквозное отношение hasManyThrough к элементам. Я хочу отфильтровать коллекцию Orders только для тех заказов, которые имеют нулевые элементы. Я попытался:

 $orders->where('items', '!=', []);
  

Это, конечно, не работает, поскольку возможно только дискретное сравнение (равно, не равно, меньше / больше и т. Д.) С конкретными значениями. Нет свойства «isEmpty». Что-то вроде a whereCallback было бы супер.

Какой был бы самый простой способ выполнить это? Одна и та же $orders коллекция уже используется несколькими способами в одном и том же запросе, поэтому я бы предпочел не делать еще один обходной путь к базе данных.

Ответ №1:

Было бы проще, если бы вы включили items_count его в orders коллекцию при извлечении из базы данных.

 $orders = Order::withCount('items')->restOfTheQuery()->get();
  

это добавит еще одно свойство, вызываемое items_count для каждого order объекта в $orders коллекции

и тогда, когда вы хотите только orders то, чего нет items

 // using collections where function
$orderWithoutItems = $orders->where('items_count', 0);
  

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

1. Я согласен, это кажется лучшим способом сделать это.

Ответ №2:

Я думаю filter() , это что-то вроде whereCallback того, что вы ищете.

 $ordersWithoutItems = $orders->filter(function($order) {
    return $order->items()->doesntExist();
});
  

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

1. $order->items() при этом используется еще один обратный доступ к базе данных, которого он хочет избежать.