Sur http://docs.joomla.org/Selecting_data_using_JDatabase , il n'y a pas de méthode documentée pour écrire une sous-requête à l'aide de JDatabase.
https://gist.github.com/gunjanpatel/8663333 illustre une façon d'y parvenir avec (quelques bits omis):
$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);
Cela semble être une bonne approche plausible, mais y en a-t-il une meilleure?
__toString()
) est une méthode "magique".Réponses:
Oui, en ce qui me concerne, la façon dont vous avez construit la sous-requête est celle adoptée par la majorité des développeurs d'extensions de joomla.
J'utilise cette même méthode sur certaines de mes extensions et extensions personnalisées faites pour les clients.
Il n'y a pas de façon "officielle" de le faire, mais le faire comme vous l'avez montré vous permet d'utiliser le générateur de requêtes tout en conservant une bonne lisibilité
la source
AFAIK, il n'y a pas de méthode intégrée pour effectuer des sous-requêtes faciles, ce qui est probablement une lacune du système et devrait être corrigé via PR.
Cependant, je ne vois aucun problème avec votre exemple - semble assez raisonnable.
~~~
Voici un exemple en réponse au commentaire de @ DavidFritsch ci-dessous. Mais plus j'y pense, mieux j'aime l'approche plus simple affichée dans l'OP. C'est plus clair ce qui se passe.
la source
subQuerySelect
méthode dans laquelle elle vous permet de le faire un peu plus "proprement". Je vais modifier ma réponse pour fournir et un exemple.Il existe également un moyen d'exécuter des requêtes contenant des sous-requêtes à l'aide de l'API Joomla Platform. L'idée de base sur la façon d'utiliser les sous-requêtes est basée sur gunjanpatel .
Voici un exemple pour exécuter des requêtes sur des modèles d'ensembles imbriqués :
Requête SQL:
et la requête transformée à exécuter par Joomla:
la source
Je vais proposer ma version de l'extrait de code, puis expliquer ma justification et inclure des citations du manuel Joomla Coding Standards (qui sera formaté entre guillemets).
J'écris d'abord les requêtes les plus internes et je passe à la requête la plus externe. Cela me permet de chaîner toutes les méthodes de construction de requêtes directement à la
getQuery()
méthode. En effet, le nom de la variable n'est écrit qu'une seule fois lors de la création de la requête individuelle.Voici un excellent exemple d'imbrication de requêtes lourdes (quand je pensais que c'était mignon d'aligner les flèches de chaînage).
J'essaye d'éviter de faire plusieurs
select()
et / ouwhere()
appels dans la même requête car je l'ai vu conduire à la confusion de développeurs moins expérimentés . Parce que ces méthodes acceptent les tableaux, je trouve qu'il est plus lisible et mieux de les utiliser pour les coder.et enfin le sujet le plus controversé ...
Je suis très opposé à cette position. Quand je suis arrivé à Joomla l'année dernière, je pensais que je ne ferais pas d'appels inutiles (aucun avantage pour la stabilité, la sécurité, la lisibilité de la requête) sur des valeurs statiques! Cependant, mon employeur aime l'idée de suivre la ligne Joomla, et je dois admettre que j'ai généralement une haute appréciation pour les règles, donc je suis arrosant mes questions avec
quote()
,(int)
etquoteName()
qui signifie aussi des tas de concaténation de chaînes (tous correctement espacés). Les résultats finaux de mon travail sont des blocs de requête horriblement gonflés que même moi, j'ai du mal à regarder. Les lignes les pires / les plus longues qui ne se prêtent pas à l'empilement vertical sont lesjoin()
appels en raison du nom de la table, de l'aliasON
, puis d'une ou plusieurs conditions qui peuvent ou non nécessiter des guillemets.Je peux comprendre que cette politique est mise en œuvre avec la sécurité à l'esprit pour les développeurs novices, mais j'aimerais bien que cette politique soit en quelque sorte tempérée par la sensibilité que tous les codeurs Joomla ne sont pas des copieurs-ignorants. Je veux dire, regardez à quel point le code est propre et bref sans les appels inutiles.Quant au nettoyage:
*
dans mes clauses SELECT__toString()
ASC
parce que c'est la direction de tri par défautla source