首页 > 解决方案 > Laravel:解决具有原始查询或自定义功能的 n + 1 问题

问题描述

我正在开发一个 Laravel 应用程序。我在查询数据时遇到了一些问题。

这是我的数据库模式。

我有一个包含以下字段的用户表。

users
- id
- name
- email
- password

然后我有带有以下字段的事务表。

transactions
- id
- amount
- user_id
- type
- created_at

如您所见,事务表将 user_id 作为用户表的外键。

这是用户模型。

class User extends Model
{
    public function transactions()
    {
        return $this->hasMany(Transaction::class, 'user_id');
    }
}

这是交易模型

class Transaction extends Model
{
    public function user()
    {
       return $this->belongsTo(User::class, 'user_id');
    }
}

现在,我正在尝试通过附加列和条件检查来获取用户的交易。通常,如果我想获得用户的交易,我会做这样的事情。

$user->transactions()->get()

但是我想为每一行获得一个额外的列,对于每一行,我想获得交易量的总和,直到当前行的交易的 created_at。

如果我必须为单个记录编写一个函数,它会是这样的。

function totalAmountUntil($user, $date)
{
   return $user->transactions->where('transactions.created_at', '<=', $date)->sum('transactions.amount');
}

我需要根据交易的 created_at 将其应用于查询中的每一行,也解决了 n+1 问题。我怎样才能做到这一点?

标签: mysqllaraveleloquent

解决方案


您可以为此使用 withCount :

User::withCount([
'transactions as transactions_amount_sum' => function($query) use ($date){
     $query->where('created_at', '<=', $date)
           ->select(DB::raw('SUM(amount)'));
}
])->get();

推荐阅读