Php 如何正确使用多个SqlSelect set/addwhere函数

Php 如何正确使用多个SqlSelect set/addwhere函数,php,silverstripe,Php,Silverstripe,我正在使用SilverStripes SQLSelect类和一些可选(前端)过滤器拼凑一个SQL查询 尝试将addWhere()与参数一起使用时,查询没有结果。例如: $sql->useConjunction(); $sql->addWhere(['SiteTree.ClassName' => 'ResourcePage']); if (self::$Filters['Tags']) { $sql->addLeftJoin('R

我正在使用SilverStripes SQLSelect类和一些可选(前端)过滤器拼凑一个SQL查询

尝试将
addWhere()
与参数一起使用时,查询没有结果。例如:

$sql->useConjunction();
        
$sql->addWhere(['SiteTree.ClassName' => 'ResourcePage']);
        
if (self::$Filters['Tags'])
{
    $sql->addLeftJoin('ResourcePage_Tags', 'ResourcePage_Tags.ResourcePageID = SiteTree.ID');
    $sql->addWhere(['ResourcePage_Tags.ResourceTagID IN (?)' => implode(',', self::$Filters['Tags'])]);
}

if (self::$Filters['Types'])
{
    $sql->addLeftJoin('ResourcePage_Types', 'ResourcePage_Types.ResourcePageID = SiteTree.ID');
    $sql->addWhere(['ResourcePage_Types.ResourceTypeID IN (?)' => implode(',', self::$Filters['Types'])]);
}
如果我将其视为一个字符串,我会得到结果(就像我期望使用手动SQL进行测试一样)。例如:

使用
$sql->\uu toString()
找到的生成(简化)查询是:

SELECT
    DISTINCT SiteTree.*
FROM
    SiteTree 
LEFT JOIN 
    "ResourcePage_Tags" ON ResourcePage_Tags.ResourcePageID = SiteTree.ID 
LEFT JOIN 
    "ResourcePage_Types" ON ResourcePage_Types.ResourcePageID = SiteTree.ID
WHERE 
 (SiteTree.ClassName = ?)
 AND (ResourcePage_Tags.ResourceTagID IN (?))
 AND (ResourcePage_Types.ResourceTypeID IN (?))

上述输出的参数部分是一个数组:

'ResourcePage',
1 => '38'
2 => '5,4'
查询中被省略的部分是与总是存在的和限制顺序的子句的一些
匹配


在字符串和参数化版本之间获得两种不同的行为,我做错了什么?

您的第一个示例是在(?)
中使用
,然后传递一个值数组将无法正确执行,因为假设
在使用prepare时是一个值。这意味着您现在正在查询一个
ResourceTypeID
,该ID等于
array\u value1,array\u value2
。因此,在
self::$Filters['Tags']
数组中,每个项目都需要一个占位符(

框架确实有一个助手方法来实现这一点,如下所示:

$placeholders=DB::placeholders(self::$Filters['Tags'))
$query->addWhere([
“ResourcePage_Types.ResourceTypeID IN($placeholders)”=>self::$Filters['Tags']
]);

啊,好的。我看到了这个示例
DB::prepared_query('DELETE FROM“SiteTree”其中的“SiteTree”。“ShowInMenus”=?,[0])在文档中。为此干杯。
'ResourcePage',
1 => '38'
2 => '5,4'