在我正在使用Propel处理数据库的系统中,我正在准备一个需要接受不同WHERE IN条件的原始查询。
我正在尝试做的一个简单示例是:
$c = Propel::getConnection();
$q = $c->prepare("SELECT foo FROM bar WHERE blah IN(:ids)");
$q->execute(array(':ids' => array(1, 2, 3, 4, 5)));
显然,这对我不起作用。我也尝试使用implode(','array(1,2,3,4,5))作为我的':ids'参数,这也不起作用。第一种方法抱怨必须接受一个数组,第二种方法抱怨将字符串与整数进行比较。
是否有正确的方法将值数组传递给WHERE IN的查询?我不想硬编码,因为这意味着为循环的每次迭代做好准备。
请注意,我实际上没有选择创建条件并使用doSelect,因为查询实际上比这里给出的示例复杂得多,我非常怀疑我可以用这种方式构建它。
非常感谢!
答案 0 :(得分:1)
这是PDO解决方法:
$yourListOfIDs = array(1, 2, 3, 4, 5);
$q = $c->prepare("SELECT foo FROM bar WHERE blah IN(".rtrim(str_repeat('?,', count($yourListOfIDs)), ',').")");
// bindValue starts at 1 (not 0)
foreach ($yourListOfIDs as $key => $val)
{
$q->bindValue(($key+1), $val);
}
$q->execute();
注意:代码未经过测试
答案 1 :(得分:1)
如果您使用的数据库是MySQL,那么可能使用如下查询:
SELECT foo FROM bar WHERE FIND_IN_SET(blah, :ids) > 0
会奏效。在这种情况下,您必须使用implode(',', array(1, 2, 3, 4, 5))
作为参数值。如果blah
属于int
类型,那么您可能需要将其投放到char
,例如FIND_IN_SET(CAST(blah AS CHAR), :ids)
答案 2 :(得分:0)