Laravel Query n + 1 - Запрос количества пользовательских атрибутов - PullRequest
0 голосов
/ 05 июня 2019

В моей модели User у меня есть следующее ...

/**
 * @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 Ответ

4 голосов
/ 05 июня 2019

Вы стремитесь загрузить отношение 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
...