Em http://docs.joomla.org/Selecting_data_using_JDatabase , não há um método documentado para escrever uma subconsulta usando o JDatabase.
https://gist.github.com/gunjanpatel/8663333 exemplifica uma maneira de fazer isso com (alguns bits omitidos):
$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);
Parece uma abordagem boa e plausível, mas existe uma melhor?
__toString()
) é um método "mágico".Respostas:
Sim, no que me diz respeito, a maneira como você construiu a subconsulta é a adotada pela maioria dos desenvolvedores de extensões do joomla.
Eu uso esse mesmo método em algumas das minhas extensões e extensões personalizadas feitas para clientes.
Não existe uma maneira "oficial" de fazer isso, mas, como você mostrou, você pode usar o construtor de consultas e ainda manter uma boa legibilidade
fonte
AFAIK não existe uma maneira integrada de realizar subconsultas fáceis, o que provavelmente é uma deficiência no sistema e deve ser corrigido via PR.
No entanto, não vejo problema com o seu exemplo - parece bastante razoável.
~~~
Aqui está um exemplo em resposta ao comentário de @ DavidFritsch abaixo. Quanto mais eu penso sobre isso, melhor eu gosto da abordagem mais simples exibida no OP. É mais claro o que está acontecendo.
fonte
subQuerySelect
método no qual ele permita que você faça um pouco mais "limpo". Vou editar minha resposta para fornecer um exemplo.Há também uma maneira de executar consultas que contêm subconsultas usando a API da plataforma Joomla. A idéia básica de como usar subconsultas é baseada em gunjanpatel .
Aqui está um exemplo para executar consultas em modelos de conjuntos aninhados :
Consulta SQL:
e a consulta transformada a ser executada pelo Joomla:
fonte
Oferecerei minha versão do trecho de código e explico minha justificativa e incluirei citações no manual do Joomla Coding Standards (que será formatado em quoteblock).
Escrevo primeiro as consultas mais internas e progredo para a consulta mais externa. Isso me permite encadear todos os métodos de criação de consultas diretamente para o
getQuery()
método Efetivamente, o nome da variável é gravado apenas uma vez ao criar a consulta individual.Aqui está um exemplo fantástico de um aninhamento de consultas pesadas (quando achei interessante alinhar as setas de encadeamento).
Eu tento evitar fazer várias
select()
e / ouwhere()
chamadas dentro da mesma consulta, porque eu vi isso levar à confusão de desenvolvedores menos experientes . Como esses métodos aceitam matrizes, acho mais legível e melhor prática de codificação usá-los.e finalmente o tópico mais controverso ...
Estou muito em conflito com essa postura. Quando cheguei ao Joomla no ano passado, pensei: não faria chamadas inúteis (nenhum benefício para a estabilidade, segurança, legibilidade da consulta) sobre valores estáticos! No entanto, o meu patrão gosta da idéia de virando a linha Joomla, e eu tenho que admitir que eu geralmente têm um alto apreço pelas regras, então eu ter sido hosing abaixo minhas consultas com
quote()
,(int)
equoteName()
que também significa montes de concatenação (todos espaçados adequadamente). Os resultados finais do meu trabalho são blocos de consulta terrivelmente inchados, que até eu tenho dificuldade em observar. As piores / longas linhas que não se prestam ao empilhamento vertical são asjoin()
chamadas por causa do nome da tabela, do aliasON
e de uma ou mais condições que podem ou não exigir citações.Compreendo que essa política seja implementada com a segurança em mente para desenvolvedores iniciantes, mas com certeza gostaria que essa política fosse moderada com a sensibilidade de que nem todos os codificadores Joomla são ignorantes. Quero dizer, veja como o código é limpo e breve, sem as chamadas desnecessárias.Quanto à limpeza:
*
nas minhas cláusulas SELECT__toString()
ASC
porque essa é a direção de classificação padrãofonte