#php #mediawiki
#php #mediawiki
Вопрос:
Предыстория:
PHP-фреймворк Mediawiki предоставляет функции для создания SQL-инструкций, которые будут выполняться в приложении. Создание простого оператора SELECT FROM WHERE легко и хорошо документировано, но я пытаюсь создать оператор JOIN и не понимаю документацию. Примеры фрагментированы и разрозненны.
Текущая попытка:
SQL, который я пытаюсь воссоздать, выглядит следующим образом. Используя phpmyadmin, я протестировал этот код, и он возвращает нужные мне результаты:
SELECT user.user_id, user.user_name, user.user_real_name, user.user_email
FROM user
LEFT JOIN ipblocks ON user.user_id = ipblocks.ipb_user
WHERE ipblocks.ipb_id IS NULL
Перевод этого в фреймворк Mediawiki выглядит примерно так, но этот код не работает. Документация по функции находится здесь.
$result = $this->dbr->select(
array( $this->dbr->tableName( 'user' )),
array( 'user_name', 'user_id', 'user_email' ),
array( 'ipb_id' => 'NULL'),
__METHOD__,
array( 'GROUP_BY' => 'user_id DSC' ),
array( 'ipblocks' => array( 'LEFT JOIN', 'user_id=ipb_user' ) )
);
SQL, сгенерированный этим кодом, можно проверить, вызвав вместо этого selectSQLText(). Эта функция возвращает сгенерированный SQL, а не выполняет его. Соглашение о вызовах такое же. Это приводит к следующему SQL:
SELECT user_name,user_id,user_email
FROM `user`
WHERE ipb_id = 'NULL'
Я могу понять, почему функция вернула это, но я не понимаю, почему последние два параметра были проигнорированы. Части GROUP_BY и JOIN были проигнорированы. Почему это так и как мне исправить код?
Спасибо.
Ответ №1:
Я не пользователь Mediawiki, я просто просмотрел документацию по функции. Что касается группировки, я считаю, что вам следует использовать GROUP BY
ключ массива, а не GROUP_BY
. Что касается соединений, я думаю, вы должны включить ipblocks
table в $table
параметр, чтобы использовать его в $join_conds
.
Итак, попробуйте это:
$result = $this->dbr->select(
array( 'user', 'ipblocks' ),
array( 'user_name', 'user_id', 'user_email' ),
array( 'ipb_id' => null),
__METHOD__,
array( 'GROUP BY' => 'user_id DSC' ),
array( 'ipblocks' => array( 'LEFT JOIN', 'user_id=ipb_user' ) )
);
Комментарии:
1. На самом деле вам не нужны все вызовы tableName (фактически, они, вероятно, приведут к двойному префиксу, если ваши таблицы используют префикс). Также вы должны использовать
NULL
, а не'NULL'
.