在 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' ) )
);
背景:
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' ) )
);