在 Eloquent Laravel 中使用 join 后求和不正确

我必须将两个表连接在一起,经过一番尝试和错误后,我能够得到它,但是在尝试对连接字段求和以便稍后按该数量排序时,我意识到数字比预期的要高得多。我尝试遵循这个问题的解决方案,但它对我不起作用:The sum amount from join table is invalid。下面是我的查询:

        $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)进行排序。如果有一个更优雅的解决方案,我完全赞成。


倚天杖
浏览 125回答 1
1回答

茅侃侃

我通过实现一个子查询,对子查询进行求和,然后最终将其连接到主查询来解决这个问题:        $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'])
打开App,查看更多内容
随时随地看视频慕课网APP