【问题标题】:Is there a way to select fields from an eager loaded table in Laravel?有没有办法从 Laravel 中预先加载的表中选择字段?
【发布时间】:2020-08-10 21:13:53
【问题描述】:

所以我在下面定义了几个关系表

父数据库:

public function backorderQuantities(){
        return $this->hasMany(BackorderQuantity::class, 'ITEMNMBR', 'ITEMNMBR')->where('SOPTYPE', 5);
    }

关系数据库:

 public function item(){
        return $this->belongsTo(Item::class, 'ITEMNMBR', 'ITEMNMBR');
    }

我这样称呼这种关系:

Item::has('backorderQuantities')
            ->select('ITEMNMBR',
                Item::raw("SUM(QTYONHND) as qty"),
                Item::raw("SUM(QTYONORD) as ordered"),
                Item::raw("SUM( ( CASE WHEN LOCNCODE LIKE 'IT-%' THEN QTYONHND END ) ) as transit"), 
            )
            ->where('PRIMVNDR', Auth::user()->vendor_id)
            ->groupBy('ITEMNMBR')
            ->orderBy($group['field'], $group['sort'])
        );

这很好用,但我还需要从 backorderQuantities 中选择字段,以便我可以按所述字段排序。换句话说,我想做这样的事情:

 Item::has('backorderQuantities')
            ->select('ITEMNMBR',
                Item::raw("SUM(QTYONHND) as qty"),
                Item::raw("SUM(QTYONORD) as ordered"),
                Item::raw("SUM( ( CASE WHEN LOCNCODE LIKE 'IT-%' THEN QTYONHND END ) ) as transit"),
                'backorderQuantities->QUANTITY'
            )
            ->where('PRIMVNDR', Auth::user()->vendor_id)
            ->groupBy('ITEMNMBR')
            ->orderBy('backorderQuantities->QUANTITY', $group['sort'])

但我遇到了这样的错误:

SQLSTATE[42S22]:[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名“backorderQuantities”无效。 (SQL: select count(*) as aggregate from (select [ITEMNMBR], SUM(QTYONHND) as qty, SUM(QTYONORD) as ordered, SUM( ( CASE WHEN LOCNCODE LIKE 'IT-%' THEN QTYONHND END ) ) 作为中转, json_value([backorderQuantities], '$."QUANTITY"') from [IV00102] where exists (select * from [SOP10200] where [IV00102].[ITEMNMBR] = [SOP10200].[ITEMNMBR] and [SOPTYPE] = 5 ) 和 [PRIMVNDR] = YHI group by [ITEMNMBR]) as [aggregate_table])

可能是因为当时表格仍在快速加载。有没有办法做到这一点?任何帮助将不胜感激!

【问题讨论】:

    标签: php sql-server laravel


    【解决方案1】:

    您需要使用 join 而不是预先加载。

    Laracasts 论坛上已经存在类似的问题: here

    【讨论】:

    • 我是相当新的/不太擅长 SQL(主要来自 mongoDB 背景),你能告诉我使用我预先存在的带有连接的查询的结构看起来如何吗?
    • 我将关系表简化为延期交货并尝试了这个Item::join('backorders', 'items.ITEMNMBR', '=', 'backorders.ITEMNMBR'),但我遇到了这个错误:SQLSTATE[42S02]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'backorders'. (SQL: select count(*) as aggregate from [IV00102] inner join [backorders] on [items].[ITEMNMBR] = [backorders].[ITEMNMBR])
    【解决方案2】:

    您可以使用 with 选择 eger 加载的列:

     Item::with('backorderQuantities:QUANTITY,...');
    

    不要忘记将 backorderQuantities 表的外键传递给选定的列

    编辑:

    要按子列排序,您应该使用 join 语句:

     Item::select('items.*')->leftJoin('items.ITEMNMBR','=','backorderQuantities.ITEMNMBR')->groupBy('backorderQuantities.ITEMNMBR')->orderBy('backorderQuantities.backorderQuantities')
    

    【讨论】:

    • 我怎样才能在同一个查询中使用该字段对 orderby 进行排序?
    • 您要订购 backorderQuantities 或 Item 表以及您用于排序的哪一列?
    • 我需要能够按backorderQuantities:QUANTITY 以及上面列出的Item 中的各个列进行排序
    • 在这种情况下你应该使用 sql join ..check update
    • 没有骰子SQLSTATE[42S02]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'items.ITEMNMBR'. (SQL: select count(*) as aggregate from (select [items].* from [IV00102] left join [items].[ITEMNMBR] on [=] = [backorderQuantities].[ITEMNMBR] group by [backorderQuantities].[ITEMNMBR]) as [aggregate_table])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 2023-03-28
    • 2013-07-12
    相关资源
    最近更新 更多