【问题标题】:Laravel - Get sum of a column without querying to database more than onceLaravel - 在不多次查询数据库的情况下获取一列的总和
【发布时间】:2021-11-18 21:31:22
【问题描述】:
我的表结构是这样的:
id user_id gift
1 1 1000
但现在我想将gift 移动到另一个表,因为礼物可以在不同日期多次赠送给用户。我在项目的很多地方都使用了$user->gift,我不想更改代码。所以我想在User 模型中创建一个名为getGiftAttribute 的方法。在这个方法中,我将得到礼物的总和。但现在的问题是,每次在我的代码中调用 $user->gift 时,它都会查询数据库,但我希望它被调用一次。和以前一样,如果我使用$user->gift,它只会查询一次。那么如何在不多次查询的情况下获得另一个表中的gift 的总和?
【问题讨论】:
标签:
php
mysql
sql
laravel
【解决方案1】:
如果您真的不想根本更改您的代码并仅通过一个查询在多个地方获得礼物的总和,您可以执行以下操作:
class User extends Models {
protected $sumGifts = null;
// [...]
public function getGiftAttribute()
{
if($this->sumGifts == null){
$this->sumGift = $this->gifts()->sum('gift');
// or whatever you use to retrieve the sum of all gifts
}
return $this->sumGifts;
}
}
这样做,您将所有礼物的总和存储在 User 模型的属性中,因此当您第一次使用 $user->gift 时,查询将只执行一次。对$user->gift 的所有后续调用都将返回先前存储在sumGifts 属性中的总和。
它会起作用,但是,我认为更好的方法是明智地使用关系和渴望加载。
【解决方案2】:
如果您将gifts 作为关系添加到用户,那么 laravel 应该自动为每个用户只查询一次礼品表。
如果您想为多个用户获取礼物并且只想访问一次gifts表,那么您可以使用eager loading。
例如,您可以在用户查询中写 ->with('gifts')。