Seorang pengembang Magento mengganti 300 panggilan ProductRepositoryInterface::getById() yang terpisah dengan satu query koleksi tunggal. Jumlah pemanggilan database turun dari 300 menjadi 1, dan halaman kategori dimuat jauh lebih cepat. Risikonya? Beberapa produk menghilang dari toko online, membingungkan pembeli dan pemilik toko.
Masalah N+1 pada halaman kategori Magento
Halaman tersebut menampilkan 300 produk. Untuk setiap produk, kode mengambil dua atribut kustom melalui metode getById() pada repository, yang menghasilkan satu query per produk—pola klasik N+1. Mengganti pemuatan per produk tersebut dengan sebuah koleksi yang menarik semua baris yang dibutuhkan dalam satu query berhasil memangkas jumlah query secara drastis. Latensi front-end membaik, tetapi daftar produk kini kehilangan item yang sebelumnya muncul.
Mengapa koleksi menyembunyikan item yang habis stok
Modul CatalogInventory milik Magento secara otomatis menambahkan filter "in-stock" ke setiap koleksi produk yang dibuat untuk frontend. Filter ini aktif ketika pengaturan toko Display Out of Stock Products dimatikan, sebuah pilihan umum bagi pedagang yang tidak ingin menampilkan item yang tidak tersedia.
Sebaliknya, repository tidak pernah menerapkan filter stok. Ia hanya memeriksa apakah suatu produk ada dan mengembalikannya, tanpa mempedulikan tingkat inventaris. Ketika kode beralih dari panggilan repository ke koleksi, filter stok secara diam-diam menghapus setiap produk yang jumlahnya nol. Tidak ada error yang tercatat; koleksi tersebut hanya mengembalikan lebih sedikit baris daripada yang diharapkan pengembang.
Apa artinya ini bagi pedagang
Toko online yang secara diam-diam menghilangkan SKU yang habis stok menimbulkan beberapa masalah:
- Komponen front-end menerima entri yang hilang, menghasilkan label kosong atau harga yang salah.
- Debugging menjadi lebih sulit karena gejalanya—produk yang hilang—tidak menghasilkan peringatan.
Karena sebagian besar pengujian otomatis menggunakan fixture yang stoknya tersedia, bug ini sering kali tetap tersembunyi sampai situs dijalankan dengan inventaris asli.
Cara menjaga kecepatan tanpa menyembunyikan inventaris
- Lewati filter stok default – Hapus filter dari koleksi secara eksplisit jika Anda membutuhkan setiap produk tanpa mempedulikan ketersediaannya. Magento menawarkan metode untuk menonaktifkan atau mengganti plugin stok per query.
- Gunakan repository saat akurasi sangat penting – Repository menjamin bahwa setiap ID produk yang diminta akan dikembalikan, meskipun stoknya habis. Cache hasilnya atau muat hanya ID yang Anda butuhkan untuk meredam query tambahan.
- Gunakan resource model atau SQL mentah – Query tabel produk secara langsung untuk atribut yang diperlukan. Ini melewati semua plugin koleksi dan memberi Anda kontrol penuh atas bar
