cari

Rumah  >  Soal Jawab  >  teks badan

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>
P粉514458863P粉514458863498 hari yang lalu610

membalas semua(1)saya akan balas

  • P粉618358260

    P粉6183582602023-07-25 10:52:49

    Saya belum menguji ini tetapi saya akan mencuba sesuatu yang serupa

    Shop::whereIn('owner_id', [123])
                ->withCount(['products' => fn($query) => $query->select(['id','type_id'])->whereColumn('products.type_id', '=', 'shops.type_id')])
                ->get()

    Jadi saya hanya menambah beberapa medan (yang anda perlukan dan yang apl perlukan untuk mengenal pasti produk), tetapi jika kiraan sahaja diperlukan, saya akan mencuba tanpa ID.

    Saya andaikan apabila anda mendapat "produk" ia akan menarik semua data, ia akan menjadi perlahan jika terdapat medan jenis "teks" seperti badan/penerangan dll.

    Selain itu, tidak pasti, tetapi anda boleh cuba menggunakan type_id dan bukannya products.type_id kerana anda sudah pun berada dalam perhubungan produk. Juga lihat mengoptimumkan cara anda menarik kedai anda.

    balas
    0
  • Batalbalas