Mysqli usando la cláusula AS no funciona

Aug 18 2020

Tengo dos mesas unidas. Ambos tienen una columna de identificación.

$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'));

Sin embargo, la cláusula AS no funciona y genera un error.

la consulta devuelta tiene b. id AS myStuff,

Más bien que

b. idCOMO myStuff,

He probado todas las combinaciones que se me ocurren para la cláusula, pero no importa lo que use, aparece un error.

¿Alguien puede decirme cuál es el formato correcto para usar una cláusula AS en la consulta?

Actualizar

Entonces descubrí que si elimino la línea b.id AS y luego agrego una

$ consulta-> select ('b.id AS myStuff');

la consulta funciona aunque faltan las marcas `. No estoy seguro de si me falta alguna otra forma de abordarlo todo dentro de la consulta original.

Respuestas

2 Sharky Aug 18 2020 at 21:29

El alias debe pasarse como segundo argumento a quoteName(). Cuando el primer argumento es una matriz, el segundo argumento también debe ser una matriz de la misma longitud. Para columnas sin valores, debe pasar null. Lo que no se ve bien en tu 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,
            )
        )
    )

Puede dividir la columna con alias como ya mencionó. Si desea mantenerlo entre comillas (lo que en realidad no es necesario a menos que los identificadores contengan palabras clave reservadas), simplemente envuélvalo en una quoteName()llamada 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'));

Personalmente, prefiero pasar una serie de columnas citadas individualmente. Es más código para escribir, pero también permite mezclar columnas con / sin alias y expresiones dentro de una sola select()llamada. Y también es más rápido debido a cómo quoteName()maneja actualmente las matrices.

$query->select(
    array(
        // Allows column without alias.
        $db->quoteName('a.id'), // Allows column with alias. $db->quoteName('b.id', 'myStuff'),
        // Allows expressions.
        COUNT(*),
    )
)