【问题标题】:sum incorrect after using join in Eloquent Laravel在 Eloquent Laravel 中使用 join 后总和不正确
【发布时间】:2020-08-12 18:00:13
【问题描述】:

我不得不将两个表连接在一起,经过反复试验,我能够得到它,但是在尝试对连接的字段求和以稍后按该数量排序时,我意识到这些数字比他们应该的要高得多是。我试图遵循这个问题的解决方案,但它对我不起作用:The sum amount from join tables is incorrect。下面是我的查询:

        $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 an eager loaded table in Laravel?

【问题讨论】:

  • 你能提供两个表的结构吗?我认为您可以在 withCount() 中使用闭包来获得总和。
  • hmm 不确定如何最好地说明这一点,但项目表和延期交货表都有我正在匹配和加入的字段 ITEMNMBR。除此之外,它们几乎没有共同的领域。我加入,以便我可以检索、显示和排序延期交货。QUANTITY
  • IV00102 来自哪里?
  • IV00102 与 Item 是同一张表,但由于连接不起作用,我不得不使用表名而不是雄辩的名称。如果我可以让连接与 eloquent $query = Item::has('backorders') ->Join('backorders', 'item.ITEMNMBR','=','backorders.ITEMNMBR') ->where('PRIMVNDR', Auth::user()->vendor_id) 一起工作,这就是它的样子@

标签: php sql-server laravel


【解决方案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'])

【讨论】:

    猜你喜欢
    • 2017-09-11
    • 2016-09-28
    • 2023-02-01
    • 2014-11-17
    • 1970-01-01
    • 2020-06-06
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多