Создание SQL-соединения в php-фреймворке Mediawiki

#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' .