在Propel中使用WHERE IN和准备好的SQL语句

时间:2011-08-04 16:54:31

标签: php select propel

在我正在使用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,因为查询实际上比这里给出的示例复杂得多,我非常怀疑我可以用这种方式构建它。

非常感谢!

3 个答案:

答案 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)

  

您不能在预准备语句中两次使用同名的命名参数标记。您不能将多个值绑定到单个命名参数,例如,SQL语句的IN()子句。

PDO::prepare

  

Propel使用PDO

Propel site