Mysqli utilisant la clause AS ne fonctionne pas

Aug 18 2020

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. idCOMME 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

2 Sharky Aug 18 2020 at 21:29

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(*),
    )
)