Ini bukan batasan PDO, ini batasan perpustakaan klien MySQL. MySQL hanya mendukung satu kueri yang sedang berlangsung dalam satu waktu. Anda tidak dapat menjalankan kueri lain saat kueri pertama masih memiliki kursor terbuka (yaitu masih memiliki hasil untuk dikembalikan).
Anda memiliki opsi ini:
-
Gunakan PDOSstatement::fetchAll() dan kumpulkan seluruh rangkaian hasil kueri luar dalam larik PHP. Ini menyelesaikan hasil kueri kueri luar. Kemudian Anda dapat mengulang array dan menjalankan kueri SQL tambahan untuk setiap iterasi loop.
Tetapi menjalankan kueri baru untuk setiap iterasi loop dari kumpulan hasil luar tidak efisien. Ini adalah cara yang baik untuk mematikan kinerja aplikasi Anda.
Beberapa orang menyebutnya Masalah Pemilihan N+1 karena Anda menjalankan pemilihan pertama, yang mengembalikan N baris, lalu Anda menjalankan N pemilihan berdasarkan hasil pemilihan pertama.
-
Jika Anda menggunakan MySQL, gunakan PDO::MYSQL_ATTR_USE_BUFFERED_QUERY yang pada dasarnya melakukan hal yang sama, mengunduh semua baris, disimpan dalam array secara internal. Kemudian panggilan berikutnya ke
fetch()
ulangi saja hasil yang di-buffer.Tapi ini juga melibatkan antipattern N+1 Selects.
-
Lebih baik menulis satu kueri SQL yang memberi Anda nilai yang Anda inginkan. Menebak dari komentar Anda, Anda ingin kategori dan jumlah baris terkait dari tabel lain di mana kategori_id cocok. Berikut ini contoh kueri SQL tersebut:
$db->pquery("SELECT c.`category_id`, c.`category_name`, COUNT(*) AS `count` FROM `database_categorys` AS c LEFT OUTER JOIN `other_table` AS t ON t.category_id = c.category_id GROUP BY c.category_id ORDER BY c.`category_name` ASC");
Bergabung adalah bagian mendasar dari SQL. Jika Anda mencoba menggunakan SQL tanpa belajar menggunakan gabungan, ini seperti menggunakan PHP tanpa belajar menggunakan while
loop.
Mulai di sini:Penjelasan Visual dari SQL Bergabung .