Mysqli usando a cláusula AS não funciona

Aug 18 2020

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

2 Sharky Aug 18 2020 at 21:29

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