为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
倚天杖 2023-10-01 15:59:53
我必须将两个表连接在一起,经过一番尝试和错误后,我能够得到它,但是在尝试对连接字段求和以便稍后按该数量排序时,我意识到数字比预期的要高得多。我尝试遵循这个问题的解决方案,但它对我不起作用: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)进行排序。如果有一个更优雅的解决方案,我完全赞成。
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

我通过实现一个子查询,对子查询进行求和,然后最终将其连接到主查询来解决这个问题:


        $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'])


查看完整回答
反对 回复 2023-10-01
  • 1 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信