Di http://docs.joomla.org/Selecting_data_using_JDatabase , tidak ada metode yang terdokumentasi untuk menulis subquery menggunakan JDatabase.
https://gist.github.com/gunjanpatel/8663333 mencontohkan satu cara untuk mencapai ini dengan (beberapa bit dihilangkan):
$subQuery = $db->getQuery(true);
$query = $db->getQuery(true);
// Create the base subQuery select statement.
$subQuery->select('*')
->from($db->quoteName('#__sub_table'))
->where($db->quoteName('subTest') . ' = ' . $db->quote('1'));
// Create the base select statement.
$query->select('*')
->from($db->quoteName('#__table'))
->where($db->quoteName('state') . ' = ' . $db->quote('1'))
->where($db->quoteName('subCheckIn') . ' IN (' . $subQuery->__toString() . ')')
->order($db->quoteName('ordering') . ' ASC');
// Set the query and load the result.
$db->setQuery($query);
Ini sepertinya pendekatan yang bagus dan masuk akal, tetapi adakah yang lebih baik?
__toString()
) adalah metode "ajaib".Jawaban:
Ya, sejauh yang saya ketahui, cara Anda membangun subquery adalah yang diadopsi oleh mayoritas pengembang ekstensi joomla.
Saya menggunakan metode yang sama pada beberapa ekstensi saya dan ekstensi khusus yang dibuat untuk klien.
Tidak ada cara "resmi" untuk melakukan ini, tetapi melakukannya seperti yang Anda tunjukkan memungkinkan Anda menggunakan pembuat kueri dan masih mempertahankan jumlah keterbacaan yang baik
sumber
AFAIK tidak ada cara bawaan untuk melakukan subkueri mudah, yang mungkin merupakan kekurangan dalam sistem dan harus diperbaiki melalui PR.
Namun, saya tidak melihat masalah dengan contoh Anda - tampaknya cukup masuk akal.
~~~
Berikut adalah contoh dalam menanggapi komentar @ DavidFritsch di bawah ini. Semakin saya memikirkannya, semakin baik saya menyukai pendekatan yang lebih sederhana yang ditampilkan di OP. Lebih jelas apa yang terjadi.
sumber
subQuerySelect
metode yang memungkinkan Anda melakukannya sedikit lebih "bersih". Saya akan mengedit jawaban saya untuk memberikan dan memberi contoh.Ada juga cara untuk mengeksekusi kueri yang berisi subkueri menggunakan Joomla Platform API. Gagasan dasar tentang cara menggunakan subqueries didasarkan pada gunjanpatel .
Berikut ini adalah contoh untuk menjalankan kueri pada Nested Set Models :
Permintaan SQL:
dan kueri yang diubah untuk dieksekusi oleh Joomla:
sumber
Saya akan menawarkan versi snippet saya kemudian menjelaskan justifikasi saya dan menyertakan kutipan dari manual Standar Coding Joomla (yang akan diformat dengan kunci kueblock).
Saya menulis kueri paling dalam terlebih dahulu dan maju ke kueri terluar. Ini memungkinkan saya rantai semua metode pembuatan kueri langsung ke
getQuery()
metode. Secara efektif, nama variabel hanya ditulis sekali saat membangun permintaan individu.Berikut ini adalah contoh hebat dari beberapa permintaan bersarang yang berat (ketika saya pikir itu lucu untuk memasang panah rantai).
Saya mencoba untuk menghindari membuat beberapa
select()
dan / atauwhere()
panggilan dalam permintaan yang sama karena saya telah melihatnya mengarah pada kebingungan pengembang yang kurang berpengalaman . Karena metode ini menerima array, saya merasa lebih mudah dibaca dan praktik pengkodean yang lebih baik untuk menggunakannya.dan akhirnya topik yang paling kontroversial ...
Saya sangat bertentangan dengan pendirian ini. Ketika saya pertama kali datang ke Joomla tahun lalu, saya pikir, saya tidak akan membuat panggilan yang tidak berguna (tidak ada manfaat untuk stabilitas, keamanan, keterbacaan permintaan) pada nilai statis! Namun, majikan saya menyukai gagasan tengah menuruti Joomla, dan saya harus mengakui bahwa saya umumnya memiliki apresiasi yang tinggi untuk aturan, jadi saya telah menyiram turun pertanyaan saya dengan
quote()
,(int)
, danquoteName()
yang juga berarti tumpukan string concatenation (semua ditempatkan dengan benar). Hasil akhir dari pekerjaan saya adalah blok permintaan yang membengkak secara mengerikan yang bahkan saya kesulitan melihatnya. Baris terburuk / terpanjang yang tidak cocok untuk penumpukan vertikal adalahjoin()
panggilan karena nama tab, aliasON
, maka satu atau lebih kondisi yang mungkin atau mungkin tidak memerlukan kuotasi.Saya bisa menghargai bahwa kebijakan ini diterapkan dengan mempertimbangkan keamanan untuk pengembang pemula, tetapi saya yakin akan suka jika kebijakan ini entah bagaimana marah dengan sensibilitas bahwa tidak semua coders Joomla adalah copy-pastor yang bodoh. Maksudku, lihat bagaimana bersih dan singkat kode terlihat tanpa panggilan yang tidak perlu.Adapun pembersihan:
*
klausa SELECT saya__toString()
ASC
karena itu adalah arah penyortiran defaultsumber