Php 如何正确使用多个SqlSelect set/addwhere函数
我正在使用SilverStripes SQLSelect类和一些可选(前端)过滤器拼凑一个SQL查询 尝试将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
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'