繁体   English   中英

在 Eloquent Laravel 中使用连接后总和不正确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM