Mysqli usando a cláusula AS não funciona
Tenho duas mesas unidas. Ambos têm uma coluna id.
$query ->select($db->quoteName(array(
'a.id',
'a.address_one',
'a.address_three',
'a.address_two',
'b.id AS myStuff',
'b.person_id'
'b.packages_id',
'b.payment_date',
)))
->from($db->quoteName('#__person','a')) ->join('INNER', $db->quoteName('#__licence', 'b') . ' ON (' . $db->quoteName('a.id') . ' = ' . $db->quoteName('b.person_id') . ')')
->where($db->quoteName('a.published') . ' = '. $db->quote('1'))
->where($db->quoteName('b.published') . ' = '. $db->quote('1'));
No entanto, a cláusula AS não funciona e gera um erro.
a consulta retornada tem b
. id AS myStuff
,
ao invés de
b
. id
AS myStuff,
Tentei todas as combinações que consigo pensar para a cláusula, mas não importa o que eu use, recebo um erro.
Alguém pode me dizer qual o formato correto para usar uma cláusula AS na consulta?
Atualizar
Descobri que se eu remover a linha b.id AS e adicionar um
$ query-> select ('b.id AS myStuff');
a consulta funciona embora as marcas `estejam faltando. Não tenho certeza se estou perdendo alguma outra maneira de lidar com tudo na consulta original.
Respostas
Alias deve ser passado como segundo argumento para quoteName()
. Quando o primeiro argumento é uma matriz, o segundo argumento também deve ser uma matriz do mesmo comprimento. Para colunas sem valores você deve passar null
. O que não parece bom no seu caso:
$query ->select( $db->quoteName(
array(
'a.id',
'a.address_one',
'a.address_three',
'a.address_two',
'b.id',
'b.person_id',
'b.packages_id',
'b.payment_date',
),
array(
null,
null,
null,
null,
'myStuff',
null,
null,
null,
)
)
)
Você pode dividir a coluna com o alias, como já mencionou. Se você quiser mantê-lo entre aspas (o que na realidade não é necessário, a menos que os identificadores contenham palavras-chave reservadas), basta envolvê-lo em uma quoteName()
chamada separada :
$query->select( $db->quoteName(
array(
'a.id',
'a.address_one',
'a.address_three',
'a.address_two',
'b.person_id',
'b.packages_id',
'b.payment_date',
)
)
)
->select($db->quoteName('b.id', 'myStuff'));
Pessoalmente, prefiro passar uma matriz de colunas individualmente citadas. É mais código para escrever, mas também permite misturar colunas com / sem aliases e expressões dentro de uma única select()
chamada. E também é mais rápido devido à forma como quoteName()
atualmente lida com matrizes.
$query->select(
array(
// Allows column without alias.
$db->quoteName('a.id'), // Allows column with alias. $db->quoteName('b.id', 'myStuff'),
// Allows expressions.
COUNT(*),
)
)