私は次の関係を持っています:雄弁を使用して大きなデータセットからカウントを照会
ジョブには多くのロールがあります。
public function roles()
{
return $this->hasMany(Role::class);
}
ロールには、シフトによるシフトと割り当てが多数あります。
public function shifts()
{
return $this->hasMany(Shift::class);
}
public function assignments()
{
return $this->hasManyThrough(Assignment::class, Shift::class);
}
シフトには多くの割り当てがあります。
public function assignments()
{
return $this->hasMany(Assignment::class);
}
特定のステータスを持つすべての割り当ての数を取得する必要があります。「承認済み」とします。これらのカウントによって、アプリケーションの実行が非常に遅くなっています。ここで私はそれをやっている方法です:
foreach ($job->roles as $role){
foreach ($role->shifts as $shift) {
$pendingCount = $shift->assignments()->whereStatus("Pending")->count();
$bookedCount = $shift->assignments()->whereIn('status', ["Booked"])->count();
}
}
私は確かに、より良い、より速い方法が必要です。これらのクエリの中には、30秒以上かかるものもあります。私が知っている何十万という課題がパフォーマンスに影響しています。どのようにこれらのクエリを高速化できますか?
あなたは熱心なロードを見て撮影したことがありますか? https://laravel.com/docs/5.1/eloquent-relationships#eager-loadingキーワード 'with'を使用して、複数のクエリではなく1つのクエリで必要な関係を持つモデルを読み込みます。 –
私はそれを調べましたが、この場合、どちらのモデルに熱心にロードすべきかはわかりませんでした。私は熱心な仕事の仕事への移行はできませんでしたか?そこには関係はありません。 –