Mysqli menggunakan klausa AS tidak berfungsi

Aug 18 2020

Saya memiliki dua tabel yang digabungkan. Keduanya memiliki kolom 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'));

Namun klausa AS tidak berfungsi dan menimbulkan kesalahan.

kueri yang dikembalikan memiliki b. id AS myStuff,

daripada

b. idSEBAGAI myStuff,

Saya telah mencoba semua kombinasi yang dapat saya pikirkan untuk klausa tersebut, tetapi apa pun yang saya gunakan, saya mendapatkan kesalahan.

Dapatkah seseorang memberi tahu saya bahwa format yang benar untuk menggunakan klausa AS dalam kueri?

Memperbarui

Jadi saya telah menemukan bahwa jika saya menghapus baris b.id AS dan kemudian menambahkan

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

kueri berfungsi meskipun tanda `hilang. Tidak yakin apakah saya kehilangan cara lain untuk menangani semuanya dalam kueri asli.

Jawaban

2 Sharky Aug 18 2020 at 21:29

Alias ​​harus diberikan sebagai argumen kedua ke quoteName(). Jika argumen pertama adalah larik, argumen kedua juga harus berupa larik dengan panjang yang sama. Untuk kolom tanpa nilai yang harus Anda lewati null. Yang tidak terlihat bagus dalam kasus Anda:

$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,
            )
        )
    )

Anda dapat membagi kolom dengan alias seperti yang telah Anda sebutkan. Jika Anda ingin membuatnya tetap dikutip (yang pada kenyataannya tidak diperlukan kecuali pengenal berisi kata kunci yang dipesan), cukup gabungkan dalam quoteName()panggilan terpisah :

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

Secara pribadi saya lebih suka melewatkan array kolom yang dikutip secara individual. Lebih banyak kode untuk ditulis tetapi juga memungkinkan pencampuran kolom dengan / tanpa alias dan ekspresi di dalam select()panggilan tunggal . Dan itu juga lebih cepat karena cara quoteName()menangani array saat ini.

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