Mysqli utilisant la clause AS ne fonctionne pas
J'ai deux tables qui sont jointes. Les deux ont une colonne 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'));
Cependant, la clause AS ne fonctionne pas et génère une erreur.
la requête renvoyée a b
. id AS myStuff
,
plutôt que
b
. id
COMME myStuff,
J'ai essayé toutes les combinaisons auxquelles je peux penser pour la clause, mais peu importe ce que j'utilise, j'obtiens une erreur.
Quelqu'un peut-il me dire ce format correct pour utiliser une clause AS dans la requête?
Mise à jour
J'ai donc constaté que si je supprime la ligne b.id AS et que j'ajoute un autre
$ query-> select ('b.id AS myStuff');
la requête fonctionne bien que les marques `soient manquantes. Je ne sais pas si je manque une autre façon de tout résoudre dans la requête d'origine.
Réponses
L'alias doit être passé comme deuxième argument à quoteName()
. Lorsque le premier argument est un tableau, le second argument doit également être un tableau de même longueur. Pour les colonnes sans valeurs, vous devez passer null
. Ce qui ne va pas bien dans votre cas:
$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,
)
)
)
Vous pouvez séparer la colonne avec un alias comme vous l'avez déjà mentionné. Si vous voulez le garder entre guillemets (ce qui n'est en réalité pas nécessaire à moins que les identificateurs ne contiennent des mots-clés réservés), enveloppez-le simplement dans un quoteName()
appel séparé :
$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'));
Personnellement, je préfère passer un tableau de colonnes citées individuellement. C'est plus de code à écrire mais permet également de mélanger des colonnes avec / sans alias et expressions à l'intérieur d'un seul select()
appel. Et c'est aussi plus rapide en raison de la façon dont quoteName()
les tableaux sont actuellement gérés.
$query->select(
array(
// Allows column without alias.
$db->quoteName('a.id'), // Allows column with alias. $db->quoteName('b.id', 'myStuff'),
// Allows expressions.
COUNT(*),
)
)