Unter http://docs.joomla.org/Selecting_data_using_JDatabase gibt es keine dokumentierte Methode zum Schreiben einer Unterabfrage mit JDatabase.
https://gist.github.com/gunjanpatel/8663333 zeigt beispielhaft einen Weg, um dies zu erreichen (einige Bits weggelassen):
$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);
Dies scheint ein guter, plausibler Ansatz zu sein, aber gibt es einen besseren?
__toString()
) ist eine "magische" Methode.Antworten:
Ja, soweit es mich betrifft, ist die Art und Weise, wie Sie die Unterabfrage erstellt haben, von der Mehrheit der Entwickler von Joomla-Erweiterungen übernommen worden.
Ich verwende dieselbe Methode für einige meiner Erweiterungen und benutzerdefinierten Erweiterungen, die für Clients erstellt wurden.
Es gibt keine "offizielle" Methode, aber Sie können den Abfrage-Generator verwenden und trotzdem eine gute Lesbarkeit beibehalten, wenn Sie dies wie gezeigt tun
quelle
AFAIK, es gibt keine eingebaute Möglichkeit, einfache Unterabfragen durchzuführen. Dies ist wahrscheinlich ein Mangel im System und sollte über PR korrigiert werden.
Ich sehe jedoch kein Problem mit Ihrem Beispiel - scheint vernünftig genug.
~~~
Hier ist ein Beispiel als Antwort auf @ DavidFritschs Kommentar unten. Je mehr ich darüber nachdenke, desto besser gefällt mir der einfachere Ansatz, der im OP angezeigt wird. Es ist klarer, was los ist.
quelle
subQuerySelect
Methode zu erstellen , mit der Sie es ein bisschen "sauberer" machen können. Ich werde meine Antwort bearbeiten, um ein Beispiel zu liefern.Es gibt auch eine Möglichkeit, Abfragen, die Unterabfragen enthalten, mithilfe der Joomla Platform-API auszuführen. Die Grundidee zur Verwendung von Unterabfragen basiert auf gunjanpatel .
Hier ist ein Beispiel für die Ausführung von Abfragen in verschachtelten Gruppenmodellen :
SQL-Abfrage:
und die von Joomla auszuführende transformierte Abfrage:
quelle
Ich biete meine Version des Snippets an, erkläre dann meine Rechtfertigung und füge Zitate aus dem Joomla Coding Standards-Handbuch hinzu (das mit Quoteblock formatiert wird).
Ich schreibe zuerst die innersten Abfragen und fahre mit der äußersten Abfrage fort. Dadurch kann ich alle Methoden zur Abfrageerstellung direkt mit der
getQuery()
Methode verketten. Tatsächlich wird der Variablenname beim Erstellen der einzelnen Abfrage nur einmal geschrieben.Hier ist ein großartiges Beispiel für eine umfangreiche Verschachtelung von Abfragen (als ich dachte, es wäre nett, die verketteten Pfeile in einer Reihe anzuordnen).
Ich versuche zu vermeiden, mehrere
select()
und / oderwhere()
Anrufe innerhalb derselben Abfrage zu tätigen, da dies zu Verwirrung bei weniger erfahrenen Entwicklern geführt hat . Da diese Methoden Arrays akzeptieren, finde ich es lesbarer und praktischer, sie zu verwenden.und schließlich das umstrittenste Thema ...
Ich bin sehr widersprüchlich in dieser Haltung. Als ich letztes Jahr zum ersten Mal zu Joomla kam, dachte ich, ich werde keine unbrauchbaren Anrufe (kein Vorteil für die Stabilität, Sicherheit und Lesbarkeit der Abfrage) bei statischen Werten tätigen! Allerdings mag mein Arbeitgeber die Idee , die Joomla Linie toeing, und ich muss zugeben , dass ich in der Regel eine hohe Wertschätzung für die Regeln, so habe ich meine Fragen mit Abspritzen
quote()
,(int)
undquoteName()
das bedeutet auch , Haufen von String - Verkettung (alle richtig beabstandet). Das Endergebnis meiner Arbeit sind schrecklich aufgeblähte Abfrageblöcke, die selbst mir schwer fallen, in die Augen zu blicken. Die schlechtesten / längsten Zeilen, die sich nicht für vertikales Stapeln eignen, sind diejoin()
Aufrufe aufgrund des Tabellennamens, des AliasON
, dann einer oder mehrerer Bedingungen, die möglicherweise ein Zitieren erfordern oder nicht.Ich kann zu schätzen wissen, dass diese Richtlinie unter Sicherheitsgesichtspunkten für unerfahrene Entwickler implementiert wird, aber ich würde es sicher begrüßen, wenn diese Richtlinie irgendwie mit der Sensibilität gemildert würde, dass nicht alle Joomla-Codierer unwissende Copy-Paster sind. Ich meine, sehen Sie sich an, wie sauber und kurz der Code ohne unnötige Aufrufe aussieht.Zum Aufwischen:
*
in meinen SELECT-Klauseln__toString()
ASC
weil das die Standardsortierrichtung istquelle