在我的用户模型上,我有以下内容...
/**
* @return \Illuminate\Database\Eloquent\Relations\HasManyThrough
*/
public function transactions(): HasManyThrough
{
return $this->hasManyThrough(Transaction::class, Product::class);
}
/**
* @return int
*/
public function getNumberOfOrdersInLastSevenDaysAttribute()
{
$weekAgo = Carbon::now()->subWeek();
return $this->transactions()->whereDate('transactions.created_at', '>', $weekAgo)->count();
}
当我使用自己的自定义属性让所有用户甚至渴望加载交易时,都会遇到n + 1问题。
我必须忽略n + 1个问题吗?
答案 0 :(得分:4)
您渴望加载transactions
关系,但是getNumberOfOrdersInLastSevenDaysAttribute
方法实际上并不使用加载的关系。它以transactions()
定义为基础编写新查询。您可以更新该方法以返回关系而不是计数,然后使用withCount
方法加载计数。
public function ordersInLastSevenDays()
{
$weekAgo = Carbon::now()->subWeek();
return $this->transactions()->whereDate('transactions.created_at', '>', $weekAgo);
}
然后加载计数并访问计数。
$user = User::withCount(['ordersInLastSevenDays'])->first()
$user->orders_in_last_seven_days_count