结合内部联接和Eloquent中的where语句

时间:2019-02-20 17:24:37

标签: php join laravel-5 eloquent

我正在尝试将以下数据库查询转换为使用Eloquent:

$orderitems = DB::table('order_items')
    ->join('orders', 'orders.id', '=', 'order_items.order_id')
    ->where('orders.status', 1)
    ->where('order_items.sku', $sku)
    ->select('order_items.*')
    ->get();

我尝试了以下操作:

$orderitems = Item::where('sku', $sku)
    ->with(['order' => function ($query) {
        $query->where('status', 0);
    }])
    ->get();

但它似乎带来了比预期更多的结果。通过使用DB::getQueryLog可以看到order_items查询未与订单表联接:

select * from `order_items` where `stock_code` = ? and `order_items`.`deleted_at` is null

我是否需要在订单项和订单之间建立新的关系,并在其中添加其他位置?

关系:

  • 订单有很多商品
  • 商品有一个订单

1 个答案:

答案 0 :(得分:0)

解决方案是使用查询范围https://laravel.com/docs/5.7/eloquent#query-scopes

在控制器中:

$orderitems = Item::stock($sku)->paginate(10);

在订单项模型中:

public function scopeStock($query, $sku)
{
    return $query->join('orders', function ($join) {
        $join->on('orders.id', '=', 'order_items.order_id');
        $join->where('orders.status', '=', 1);
    })
    ->select('order_items.*', 'orders.order_date')
    ->where('order_items.sku', $sku);
}