【问题标题】:How can write this query with laravel query builder?如何使用 laravel 查询生成器编写此查询?
【发布时间】:2020-06-22 12:56:07
【问题描述】:

我有两张桌子ordersordered_items

订单

Id | quantity

ordered_items

order_id | product_id

我想查询所有订单数量等于ordered_items count的订单。

我可以使用原始查询来做到这一点,但我想用 laravel 查询构建器编写这个查询。我怎样才能做到这一点。

SELECT *
FROM orders
WHERE quantity = (
    SELECT COUNT(*)
    FROM ordered_items
    WHERE ordered_items.order_id = orders.ID)

【问题讨论】:

    标签: sql laravel eloquent


    【解决方案1】:

    你必须使用关系查询

    在您的订单型号中

    public function orderedItems(){
        return $this->hasMany(OrderedItem::class);
    }
    

    在您的 OrderedItem 模型中

    public function order(){
    
        return $this->belongsTo(Order::class);
    
    }
    

    在你的控制器中等效代码

    $order = Order::find($id);
    $order->orderedItems()->count();
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      $values=DB::table('orders')->where('orders.quantity','=',
      DB::raw("SELECT COUNT(*) FROM ordered_items WHERE ordered_items.order_id = orders.ID"))->get();
      

      或使用连接子查询方式join sub query way:

      SELECT * FROM 订单 WHERE 数量 = ( SELECT COUNT ( * ) FROM ordered_items WHERE ordered_items.order_id = orders.ID)

      你可以把它分成两部分...

      $ordered_items_counts=DB::table('ordered_items')->selectRaw('order_id,count(*) as orders_count')->groupBy('order_id');
      
      $values=DB::table('orders')->joinSub($ordered_items_counts,'ordered_items_counts',function($join){
      $join->on('orders.id', '=', 'ordered_items_count.order_id');
      })->whereRaw('ordered_items_counts.orders_count=orders.quantity')->get();
      

      如果您的模型具有正确的关系,事情应该会更容易:

      $values = Order::withCount('orderedItems')
          ->havingRaw('orderedItems_count=quantity')
          ->get();
      

      【讨论】:

      • $values = Order::withCount('orderedItems') ->havingRaw('orderedItems_count=quantity') ->get();我想这样做,我认为需要在子查询上绑定,因为在与数量比较时不会找到 orderd_items_count 列
      • 此列是自动生成的:laravel.com/docs/7.x/…
      • 它可能是:orderedItems_count,或者根据你的关系名称ordered_Items_count ...
      猜你喜欢
      • 2018-09-28
      • 1970-01-01
      • 2013-05-30
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 2019-09-08
      • 2020-12-25
      相关资源
      最近更新 更多