Mysqli с использованием предложения AS не работает

Aug 18 2020

У меня есть две соединенные таблицы. У обоих есть столбец идентификатора.

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

Однако предложение AS не работает и вызывает ошибку.

возвращенный запрос имеет b. id AS myStuff,

скорее, чем

b. idКАК myStuff,

Я пробовал все возможные комбинации для предложения, но независимо от того, что я использую, я получаю сообщение об ошибке.

Может ли кто-нибудь сказать мне, что правильный формат для использования предложения AS в запросе?

Обновить

Итак, я обнаружил, что если я удалю строку b.id AS, а затем добавлю отдельный

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

запрос работает, хотя отметки `отсутствуют. Не уверен, что мне не хватает другого способа решить все это в исходном запросе.

Ответы

2 Sharky Aug 18 2020 at 21:29

Псевдоним должен быть передан в качестве второго аргумента quoteName(). Когда первый аргумент является массивом, второй аргумент также должен быть массивом той же длины. Для столбцов без значений вы должны передать null. Что в вашем случае выглядит не очень хорошо:

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

Вы можете разбить столбец с псевдонимом, как вы уже упоминали. Если вы хотите сохранить его в кавычках (что на самом деле не обязательно, если идентификаторы не содержат зарезервированные ключевые слова), просто оберните его в отдельный quoteName()вызов:

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

Лично я предпочитаю передавать массив столбцов с индивидуальными кавычками. Это больше кода для написания, но также позволяет смешивать столбцы с / без псевдонимов и выражений внутри одного select()вызова. И это также быстрее из-за того, как в quoteName()настоящее время обрабатываются массивы.

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