SilverStripe SQLSelect where子句或where或where in

时间:2019-12-10 15:50:49

标签: silverstripe silverstripe-4

我正在从事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联接。如何在“或”中使用“哪里”?

我想到了使用setWhereAny。事实是,我们不能为PHP中的数组设置如下相同的数组键。

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

这也不起作用

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

1 个答案:

答案 0 :(得分:0)

您的“哪里”应该像这两个中的任何一个;

$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 = ?))

希望这会有所帮助