【问题标题】:SilverStripe SQLSelect where clause or where or where inSilverStripe SQLSelect where 子句或 where 或 where in
【发布时间】:2019-12-10 15:50:49
【问题描述】:

我正在从事 SilverStripe 项目。在我的项目中,我需要编写手动/自定义查询。我试图找出在我的查询中设置“或在哪里”“在哪里”的位置。

这是我当前的代码

    $sqlQuery = new SQLSelect();
    $sqlQuery->setSelect('Player.*');
    $sqlQuery->setFrom('Player');
    $sqlQuery->addWhere([ '"Player"."ID"' => 1 ]);
    $sqlQuery->addWhere([ '"Player"."ID"' => 2 ]);
    $sqlQuery->addWhere([ '"Player"."ID"' => 3 ]);

我想要做的是我试图选择播放 id 为 1 或 2 或 3 的记录。但它不起作用,因为它将与 AND 而不是 OR 连接。如何使用 where in 或 where?

我想过使用 setWhereAny。问题是我们不能为 PHP 中的数组设置相同的数组键,如下所示。

$sqlQuery->setWhereAny([ 'ID' => 1, 'ID' => 2 ])

这也行不通

$sql->setWhereAny([ 'ID' => 1 ])->setWhereAny([ 'ID' => 2 ]);

【问题讨论】:

  • $sqlQuery->setWhereAny([ 'ID' => 1, 'ID' => 2 ]) setWhereAny([ 'ID' => 1 ])->setWhereAny([ 'ID' => 2 ]);

标签: silverstripe silverstripe-4


【解决方案1】:

您的“位置”应该是这两个中的任何一个;

$aIDs = [1,2,3];
1. $sqlQuery->addWhere(['ID IN (?)'=>implode(',',$aIDs)]);
2. $sqlQuery->addWhere('ID = 1 OR ID = 2 OR ID = 3');

addWhere 在构建 SQL 查询时,'where' 子句位于数组值中,每次使用 ->addWhere() 时,这些值都会合并。所以数组键是表列。

setWhereAny;在您的情况下,这不适用,因为您只有 1 列要过滤。正确使用 setWhereAny 会是这样的

$sqlQuery->addWhereAny(array(
     'ID' => 1,
     'OtherID' => 3
));

相应的查询将是

SELECT * FROM Player WHERE ((ID = ?) OR (OtherID = ?))

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多