过滤基于子集合的空置来启发集合

时间:2019-04-09 23:09:10

标签: php laravel

Orders实现与Items的HasManyThrough关系。我想将Orders集合过滤为仅包含零项的订单。我尝试过:

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

这当然是行不通的,因为只能对具体值进行离散比较(相等,不相等,小于/大于等)。没有“ isEmpty”属性。像whereCallback之类的东西会很棒。

最简单的方法是什么?相同的$orders集合已在同一请求中以多种方式使用,所以我宁愿不进行另一次数据库往返。

2 个答案:

答案 0 :(得分:1)

如果在从数据库中获取items_count集合时将orders包含到$orders = Order::withCount('items')->restOfTheQuery()->get(); 中,将会更加容易。

items_count

这将为order集合中的每个$orders对象添加另一个名为orders的属性

然后,当您只想要没有items的{​​{1}}

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

答案 1 :(得分:0)

我认为filter()有点像您正在寻找的whereCallback

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