【问题标题】:Laravel eager loading with conditional select not work带有条件选择的 Laravel 急切加载不起作用
【发布时间】:2019-06-29 18:10:46
【问题描述】:

我正在尝试通过预先加载来选择我的列值的总和。

我的查询是

$transactions = Service::with(['transactions' => function($query) use ($queryData){
        $query->whereIn('status',['Success','Pending','Successful','Processing']);
        $query->whereDate('created_at','>=', $queryData);
        $query->addSelect(DB::raw("SUM(deducted) as adjustment"));
}]);

但我的回复没有得到任何金额。

我得到的响应看起来像

"id": "3",
"name": "Service Name",
"transactions": [ ]

但应该是的

"id": "3",
"name": "Service Name",
"adjustment": 30

【问题讨论】:

    标签: php laravel laravel-5 eloquent eager-loading


    【解决方案1】:

    使用withCount():

    $transactions = Service::withCount(['transactions as adjustment' => function($query) use ($queryData){
        $query->whereIn('status',['Success','Pending','Successful','Processing']);
        $query->whereDate('created_at','>=', $queryData);
        $query->select(DB::raw('SUM(deducted)'));
    }]);
    

    【讨论】:

    • 小记一下,这里会有$transaction->adjustment_count,而不仅仅是$transaction->adjustment
    • @MihirBhende 仅在旧版本的 Laravel 中。
    • 不是真的:) documentation
    • @MihirBhende _count 仅在您使用别名时附加。试试看。
    • 哦,我的错!错过了你有别名
    【解决方案2】:

    您可能希望对集合使用 sum 函数,而不是查询中的原始 SQL。仍然只打 DB 一次:

    我不知道扣除的金额在哪里,但如果在模型上(从上面的查询中看起来),这将为您提供查询的这些交易的总和:

    $adjustment= $transactions->sum('deducted');
    

    或者如果在关系上

    $adjustment= $transactions->sum(function ($transaction) {
        return $transaction->transaction?->sum('deducted');
    });
    

    您也可以使用点符号获取相关字段:

    $adjustment= $transactions->sum('transaction.deducted');
    

    这些允许您保留您的对象集合($transactions,以及您指出必要的nameid 字段)并且仍然从原始查询中获取总和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多