Laravel 将包含多个联接的复杂SQL查询转换为雄辩的

Laravel 将包含多个联接的复杂SQL查询转换为雄辩的,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,我有一个stackoverflow成员慷慨赠予我的SQL查询,它在Laravel中工作: $actives = DB::select('SELECT a.* ,COALESCE(b.sold,0), sold FROM ( SELECT * FROM products p WHERE p.product_type_id = 1 AND DATE(p.visible

我有一个stackoverflow成员慷慨赠予我的SQL查询,它在Laravel中工作:

$actives = DB::select('SELECT a.* ,COALESCE(b.sold,0), sold
                      FROM ( SELECT * FROM products p 
                      WHERE p.product_type_id = 1
                      AND DATE(p.visible_date) <= ? 
                      AND p.active = 1 
                      AND (p.end_date >= ? or p.end_date IS NULL) ) a 
                      LEFT JOIN ( SELECT product_id , SUM(quantity) sold 
                      FROM order_items oi JOIN orders o 
                      ON o.id = oi.order_id 
                      AND o.paid is not null 
                      GROUP BY product_id ) b
                      ON b.product_id = a.id', [Carbon::now(), Carbon::now()]);
雄辩的查询生成器有一个
leftJoinSub
函数,但文档似乎表明,它只适用于将查询与一个子查询连接起来,而我似乎需要将新查询与两个子查询连接起来


有没有人知道如何将原始SQL放入Eloquent,这样我就可以得到一个产品集合而不是一个数组?

有一种更简单的方法,也可以减少数据库的资源成本

我想您已经声明了
产品
订单

Class Product extends Model
{
    public function getSoldAttribute()
    {
        return $this->orderItems()
            ->select(\DB::raw('SUM(quantity) as sold'))
            ->join('orders', 'order_items.order_id', '=', 'orders.id')
            ->whereNotNull('orders.paid')
            ->groupBy('product_id')
            ->value('sold');
    }
...
然后,使用所需的过滤器获取产品,并访问
$product->saled
属性

$products = Products::where('product_type_id', 1)
     ->whereDate('visible_date', '<=', Carbon::now())
     ->where('active', true)
     ->where(function ($query) {
         $query->where('end_date', '>=', Carbon::now())
               ->orWhere('end_date', null);  
     })->get();
foreach($products as $product) {
    var_dump($product->sold);
}
$products=products::where('product\u type\u id',1)
->whereDate('visible_date','=',Carbon::now())
->或其中(“结束日期”,空);
})->get();
foreach($products as$product){
var_转储($product->SALL);
}

您还可以使用
protected$appends=['salled']强制加载
Product
模型中的
salled
属性

我在
产品
订单
之间没有关系。在
订单
订单项
之间存在关系,在
产品
订单项
之间存在关系。我应该做一个新的hasManyThrough吗?这看起来正是我想要的,但我有错误。首先,我得到了对undefined方法illumb\Database\Query\Expression::groupBy()的
调用。
。另一篇文章说,将它移到
选择之前,我已经这样做了,现在我得到了
调用undefined方法illumb\Database\Query\Expression::value()
@Jacey你做了什么
返回$this->orders->select(
而不是
返回$this->orders()->select(
。你能给你的问题添加
orders
关系吗?我复制了它,就像你写的一样,它缺少一个括号,顺便说一句,但我更正了。我添加了关系
公共函数orders(){return$this->hasManyThrough('App\Order','App\OrderItem');}
是。实际上我也不想要订单。我想要该产品id的OrderItems之和,其中orders.paid不为空。
$products = Products::where('product_type_id', 1)
     ->whereDate('visible_date', '<=', Carbon::now())
     ->where('active', true)
     ->where(function ($query) {
         $query->where('end_date', '>=', Carbon::now())
               ->orWhere('end_date', null);  
     })->get();
foreach($products as $product) {
    var_dump($product->sold);
}