mysql - 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 问题。我怎样才能做到这一点?
解决方案
您可以为此使用 withCount :
User::withCount([
'transactions as transactions_amount_sum' => function($query) use ($date){
$query->where('created_at', '<=', $date)
->select(DB::raw('SUM(amount)'));
}
])->get();
推荐阅读
- laravel - 将自定义列添加到 Eloquent 查询结果(Laravel)
- angular - Angular MSAL AuthError 中的错误:身份验证中出现意外错误。:哈希不包含状态
- javascript - 为什么我不能添加文本并删除它?
- html - 屏幕太小时,Angular Material 步进标题消失
- javascript - 遍历 Firestore 中的对象列表
- excel - Excel VBA - 遍历 Outlook 文件夹的最有效方法
- python - 当许多 python 脚本正在运行时,如何终止一个 python 脚本?
- flutter - Flutter Driver(或 Silenium/Ghost Inspector)的高级功能
- sql - PostgreSQL查询:写一个查询返回每组连续数的最大值
- git - git reorder 分支中的提交“就地”而不重新设置