En http://docs.joomla.org/Selecting_data_using_JDatabase , no existe un método documentado para escribir una subconsulta utilizando JDatabase.
https://gist.github.com/gunjanpatel/8663333 ejemplifica una forma de lograr esto con (se omiten algunos bits):
$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);
Este parece un buen enfoque plausible, pero ¿hay uno mejor?
__toString()
) es un método "mágico".Respuestas:
Sí, en lo que a mí respecta, la forma en que construiste la subconsulta es la adoptada por la mayoría de los desarrolladores de extensiones de joomla.
Utilizo el mismo método en algunas de mis extensiones y extensiones personalizadas para clientes.
No existe una forma "oficial" de hacerlo, pero hacerlo como se muestra le permite usar el generador de consultas y aún así mantener una buena legibilidad
fuente
AFAIK no hay una forma integrada de hacer subconsultas fáciles, lo que probablemente sea una deficiencia en el sistema y debe corregirse a través de PR.
Sin embargo, no veo ningún problema con su ejemplo, parece bastante razonable.
~~~
Aquí hay un ejemplo en respuesta al comentario de @ DavidFritsch a continuación. Sin embargo, cuanto más lo pienso, mejor me gusta el enfoque más simple que se muestra en el OP. Está más claro lo que está pasando.
fuente
subQuerySelect
método en el que le permita hacerlo un poco más "limpiamente". Editaré mi respuesta para proporcionar y ejemplo.También hay una forma de ejecutar consultas que contienen subconsultas utilizando la API de la plataforma Joomla. La idea básica sobre cómo usar subconsultas se basa en gunjanpatel .
Aquí hay un ejemplo para ejecutar consultas en modelos de conjuntos anidados :
Consulta SQL:
y la consulta transformada para ser ejecutada por Joomla:
fuente
Ofreceré mi versión del fragmento, luego explicaré mi justificación e incluiré citas del manual de estándares de codificación de Joomla (que tendrá un formato de bloque de citas).
Escribo las consultas más internas primero y avanzo a la consulta más externa. Esto me permite encadenar todos los métodos de creación de consultas directamente al
getQuery()
método. Efectivamente, el nombre de la variable solo se escribe una vez al generar la consulta individual.Aquí hay un excelente ejemplo de una gran anidación de consultas (cuando pensé que era lindo alinear las flechas de encadenamiento).
Intento evitar hacer varias llamadas
select()
y / owhere()
llamadas dentro de la misma consulta porque he visto que esto genera confusión entre los desarrolladores menos experimentados . Debido a que estos métodos aceptan matrices, me parece más legible y una mejor práctica de codificación emplearlos.y finalmente el tema más controvertido ...
Estoy muy en conflicto con esta postura. Cuando llegué por primera vez a Joomla el año pasado, pensé, ¡no voy a hacer llamadas inútiles (sin beneficio para la estabilidad, seguridad, legibilidad de la consulta) en valores estáticos! Sin embargo, mi empleador le gusta la idea de no cruzar la línea de Joomla, y tengo que admitir que por lo general tienen un alto aprecio por las reglas, así que he estado riega abajo de mis consultas con
quote()
,(int)
yquoteName()
que también significa un montón de concatenación de cadenas (todo correctamente espaciado). Los resultados finales de mi trabajo son bloques de consulta horriblemente hinchados que incluso a mí me cuesta mucho mirar. Las líneas peores / más largas que no se prestan al apilamiento vertical son lasjoin()
llamadas debido al nombre de la tabla, el alias,ON
y luego una o más condiciones que pueden o no requerir comillas.Puedo apreciar que esta política se implementa teniendo en cuenta la seguridad para los desarrolladores novatos, pero seguro que me gustaría si esta política se atenuara de alguna manera con la sensibilidad de que no todos los codificadores de Joomla son ignorantes. Quiero decir, mira qué tan limpio y breve se ve el código sin las llamadas innecesarias.En cuanto a la limpieza:
*
en mis cláusulas SELECT__toString()
ASC
porque esa es la dirección de clasificación predeterminadafuente