Mysqli utilizzando la clausola AS non funziona

Aug 18 2020

Ho due tavoli uniti. Entrambi hanno una colonna 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'));

Tuttavia la clausola AS non funziona e genera un errore.

la query restituita ha b. id AS myStuff,

anziché

b. idCOME myStuff,

Ho provato tutte le combinazioni che mi vengono in mente per la clausola, ma non importa cosa uso, ricevo un errore.

Qualcuno può dirmi il formato corretto per l'utilizzo di una clausola AS nella query?

Aggiornare

Quindi ho scoperto che se rimuovo la riga b.id AS e poi aggiungo un file

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

la query funziona anche se mancano i segni `. Non sono sicuro che mi manchi qualche altro modo per affrontare il tutto all'interno della query originale.

Risposte

2 Sharky Aug 18 2020 at 21:29

Alias ​​dovrebbe essere passato come secondo argomento a quoteName(). Quando il primo argomento è un array, anche il secondo argomento dovrebbe essere un array della stessa lunghezza. Per le colonne senza valori dovresti passare null. Che non va bene nel tuo 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,
            )
        )
    )

Puoi suddividere la colonna con l'alias come hai già menzionato. Se vuoi mantenerlo tra virgolette (che in realtà non è necessario a meno che gli identificatori non contengano parole chiave riservate), racchiudilo semplicemente in una quoteName()chiamata separata :

$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 preferisco passare un array di colonne quotate singolarmente. È più codice da scrivere, ma consente anche di mescolare colonne con / senza alias ed espressioni all'interno di una singola select()chiamata. Ed è anche più veloce grazie al modo quoteName()in cui gestisce attualmente gli array.

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