簡體   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