#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()
при этом используется еще один обратный доступ к базе данных, которого он хочет избежать.