Kira bilangan model berkaitan Laravel dan Mysql melalui jadual perantaraan menggunakan syarat tambahan.
<p>Saya mempunyai pertanyaan MySQL (dibina menggunakan pemuatan bersemangat Laravel Eloquent dan fungsi withCount) yang mengalami beberapa masalah prestasi apabila menangani set data yang besar, adakah terdapat cara untuk memperbaiki pertanyaan di bawah? </p><p>Saya perlu mendapatkan semua kedai dan mengira bilangan produk yang berkaitan dengan kedai (dikaitkan melalui jadual perantaraan), tetapi terdapat syarat tambahan bahawa type_id kedai adalah sama dengan id_jenis produk. Saya rasa syarat kedua ini menyebabkan pertanyaan tidak menggunakan indeks yang betul. </p><p>Terdapat jadual perantaraan antara kedua-dua model. </p><p> kedai(id, type_id, owner_id) product(id, type_id) store product(shop_id, product_id) </p><p> Saya mempunyai indeks pada semua kunci asing, juga ada indeks komposit pada shop_product(shop_id, product_id). </p><p>Jadi pertanyaan saya ialah ini: </p><p><br /></p>
<pre class="brush:php;toolbar:false;">pilih
kedai.*,
(
pilih
kira(*)
daripada
produk
inner join shop_products on
products.id = shop_products.product_id
di mana
shops.id = shop_products.shop_id
dan products.type_id = shops.type_id)
daripada
kedai-kedai
di mana
shops.owner_id in (?)</pre>
<p>adakah mungkin pertanyaan ini boleh dioptimumkan entah bagaimana, mungkin tidak menggunakan pertanyaan withCount whereColumn laravel ini?</p>
<pre class="brush:php;toolbar:false;">... Shop::withCount(['products' => fn($query) => $query->whereColumn('products. type_id', '=', 'shops.type_id')]);</pre>
<p>Pertanyaan lengkap adalah seperti ini:</p>
<pre class="brush:php;toolbar:false;">Shop::whereIn('owner_id', [123])
->withCount(['products' => fn($query) => $query->whereColumn('products.type_id', '=', 'shops.type_id')])
->dapatkan()</pre>
<p>Adakah saya perlu menambah indeks gabungan pada kedai(id, type_id) dan produk(id, type_id)? </p>