在 Mediawiki 的 php 框架中创建 SQL 连接

Creating an SQL join in Mediawiki's php framework

背景:

Mediawiki 的 PHP 框架提供了创建 SQL 语句以针对应用程序执行的功能。创建一个简单的 SELECT FROM WHERE 语句很容易,而且有据可查,但我正在尝试创建一个 JOIN 语句,但我不理解文档。这些例子是支离破碎和脱节的。

当前尝试:

我正在尝试重新创建的 SQL 如下。我使用 phpmyadmin 测试了这段代码,它 returns 我需要的结果:

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 的框架看起来像这样,但这段代码不起作用。函数文档是 here.

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

可以通过调用 selectSQLText() 来检查此代码生成的 SQL。此函数 returns 生成 SQL 而不是执行它。调用约定是相同的。这导致以下 SQL:

SELECT user_name,user_id,user_email
FROM `user`
WHERE ipb_id = 'NULL'

我明白为什么函数返回了这个,但我不明白为什么最后两个参数被忽略了。 GROUP_BY 和 JOIN 部分已被忽略。为什么会这样,我该如何更正代码?

谢谢。

我不是 Mediawiki 的用户,我只是忽略了功能文档。至于分组,我相信你应该使用 GROUP BY 数组键,而不是 GROUP_BY。至于联接,我认为您必须在 $table 参数中包含 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' ) )
);