Создание SQL-соединения в php-фреймворке Mediawiki - PullRequest
0 голосов
/ 27 марта 2019

Справочная информация:

Среда 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 Ответ

2 голосов
/ 27 марта 2019

Я не пользователь Mediawiki, я просто просмотрел документацию по функциям.Что касается группировки, я считаю, что вы должны использовать GROUP BY ключ массива, а не GROUP_BY.Что касается объединений, я думаю, что вы должны включить ipblocks таблицу в параметр $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' ) )
);
...