在laravel中检查一对多关系

时间:2018-12-01 08:42:10

标签: laravel

我有一个产品表,其中每个产品都有很多订单,product.php

 public function orders()
  {
    return $this->hasMany(Order::class,'product_id');
  }

我可以使用以下代码获取按order_count订购的产品:

$products = Product::withCount('orders')->orderBy('orders_count', 'desc')->get();

现在我想在控制器中获得订单数大于5的产品 我该怎么办?

3 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是使用whereHas()

$products = Product::withCount('orders')
    ->whereHas('orders', null, '>', 5)
    ->orderBy('orders_count', 'desc')
    ->get();

我认为文档中没有提到它,但是您不必通过闭包作为第二个参数,并且可以使用第3个和第4个参数来传递运算符和计数。


或者,您可以改用having()

$products = Product::withCount('orders')
    ->having('orders_count', '>', 5)
    ->orderBy('orders_count', 'desc')
    ->get();

答案 1 :(得分:0)

下面的代码应该只为您提供数量大于5的订单

$products = Product::withCount('orders')->where('orders_count', '>', 5)->orderBy('orders_count', 'desc')->get();

添加->where()应该可以。

希望有帮助。

更新

尝试

->whereRaw('count("orders.id") > 5')

这应该可以使订单数量超过5个。

答案 2 :(得分:0)

您可以在集合上使用映射来过滤出记录,例如:`

    $collection = collect($products)->map(function ($product) {
                            return $product->orders->count() > 5;
                    })
                    ->reject(function ($name) {
                         return $product->orders->count() < 5;
                     });`

这只是一个示例,您可以根据需要添加更多条件。 希望这会有所帮助。