Laravel Query n + 1-查询自定义属性关系计数

时间:2019-06-05 20:28:37

标签: laravel laravel-5 eloquent laravel-5.8

在我的用户模型上,我有以下内容...

/**
 * @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问题。

enter image description here

我必须忽略n + 1个问题吗?

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