Laravel 将包含多个联接的复杂SQL查询转换为雄辩的
我有一个stackoverflow成员慷慨赠予我的SQL查询,它在Laravel中工作: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
$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);
}