追加の条件を使用して、中間テーブルを通じて Laravel および Mysql 関連モデルの数をカウントします。
<p>MySQL クエリ (Laravel Eloquent の積極的な読み込みと withCount 関数を使用して構築) がありますが、大規模なデータセットを処理するときにパフォーマンスの問題が発生します。以下のクエリを改善する方法はありますか? </p><p>すべてのストアを取得し、そのストアに関連する製品の数を数える必要があります (中間テーブルを通じて関連付けられています)。ただし、ストアの type_id が製品の type_id。この 2 番目の条件により、クエリで正しいインデックスが使用されなくなっていると思います。 </p><p>2 つのモデルの間には中間のテーブルがあります。 </p>gt;<p>store(id, type_id, owner_id) product(id, type_id) store product(shop_id, product_id) </p>gt;<p> すべての外部キーにインデックスがあります。 shop_product(shop_id, product_id) の複合インデックス。 </p><p>つまり、私のクエリは次のとおりです: </p><p><br /></p>
<pre class="brush:php;toolbar:false;">選択
ショップ。*、
(
選択する
カウント(*)
から
製品
内部結合 shop_products 上の
products.id = shop_products.product_id
どこ
ショップID = ショップ製品.ショップID
および products.type_id = shop.type_id)
から
店
どこ
(?)</pre>のshops.owner_id
<p>このクエリは、おそらくこのlaravelのwithCount whereColumnクエリを使用せずに、何らかの方法で最適化できる可能性はありますか?</p>
<pre class="brush:php;toolbar:false;">... Shop::withCount(['products' => fn($query) => $query->whereColumn('products. type_id', '=', 'shops.type_id')]);</pre>
<p>完全なクエリは次のようになります:</p>
<pre class="brush:php;toolbar:false;">Shop::whereIn('owner_id', [123])
->withCount(['products' => fn($query) => $query->whereColumn('products.type_id', '=', 'shops.type_id')])
->get()
<p>store(id, type_id) と product(id, type_id) に複合インデックスを追加する必要がありますか? </p>