[英]sum incorrect after using join in Eloquent Laravel
我不得不将两个表连接在一起,经过反复试验,我能够得到它,但是在尝试对连接的字段求和以稍后按该数量排序时,我意识到这些数字比它们应该的要高得多。 我试图遵循这个问题的解决方案,但它对我不起作用: 连接表的总和不正确。 下面是我的查询:
$query = Item::has('backorders')
->join('SOP10200', 'IV00102.ITEMNMBR','=','SOP10200.ITEMNMBR')
->select('IV00102.ITEMNMBR',
//These sums are wrong when using join
Item::raw("SUM(IV00102.QTYONHND) as qty"),
Item::raw("SUM(IV00102.QTYONORD) as ordered"),
Item::raw("SUM( ( CASE WHEN IV00102.LOCNCODE LIKE 'IT-%' THEN IV00102.QTYONHND END ) ) as transit"),
Item::raw("SUM(SOP10200.QUANTITY) as backorder"),
)
->where('IV00102.PRIMVNDR', Auth::user()->vendor_id)
->groupBy('IV00102.ITEMNMBR')
->orderBy($group['field'], $group['sort'])
->limit(2147483647);
以下是我的人际关系:
public function item(){
return $this->belongsTo(Item::class, 'ITEMNMBR', 'ITEMNMBR');
}
public function backorders(){
return $this->hasMany(Backorder::class, 'ITEMNMBR', 'ITEMNMBR')->where('SOPTYPE', 5);
}
我想指出,我不能在连接中使用关系标识符,而不得不直接引用表,但关系以其他方式工作,并且在没有连接的情况下进行了测试。 换句话说,我加入的全部原因是我可以按延期交货(SOP10200)排序。 如果有一个更优雅的解决方案,我完全赞成。 为了避免重复提供的解决方案,我还想附上我之前与解决连接问题相关的问题: Is there a way to select fields from a eager loading table in Laravel?
我通过实现子查询解决了这个问题,对子查询进行求和,然后最终将其加入主查询:
$subQuery = Backorder::select('ITEMNMBR', Backorder::raw('sum(QUANTITY) as backorder'), 'SOPTYPE')
->groupBy('ITEMNMBR', 'SOPTYPE');
$subQuerySql = $subQuery->toSql();
$query = Item::has('backorders')
->where('IV00102.PRIMVNDR', Auth::user()->vendor_id)
->leftjoin(Item::raw('(' . $subQuerySql . ') as bbo'),function($join) use ($subQuery) {
$join->on('IV00102.ITEMNMBR', '=', 'bbo.ITEMNMBR');
})
->where('bbo.SOPTYPE', 5)
->select('IV00102.ITEMNMBR',
'bbo.backorder',
Item::raw("SUM(IV00102.QTYONHND) as qty"),
Item::raw("SUM(IV00102.QTYONORD) as ordered"),
Item::raw("SUM( ( CASE WHEN IV00102.LOCNCODE LIKE 'IT-%' THEN IV00102.QTYONHND END ) ) as transit"),
)
->mergeBindings($subQuery->getQuery())
->groupBy('IV00102.ITEMNMBR', 'bbo.backorder')
->orderBy($group['field'], $group['sort'])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.