如何使用Zend_Db_Select创建WHERE IN子句

69

所以我正在尝试实现类似于这样的功能:

SELECT * FROM table WHERE status_id IN (1,3,4);

使用Zend_Db_Select...我找不到如何做它:( 它真的可能吗?

6个回答

181

你也可以像这样使用它:

$data = array(1,3,4);
$select->where('status_id IN(?)', $data);

你不需要使用implode函数将数组转换为字符串,这样做更安全


13
在搜索这个问题并找到你的解决方案后,我意识到我已经点赞过一次了。因此,由于我不能再次点赞,那就请把这个评论作为我的感激之情吧! - leek
这么多关于对IN进行参数化的变体,感谢你为我节省了一个使用Google搜索的晚上! - Alana Storm
Martin,我尝试使用implode,但发现整个字符串都被引用了。感谢您提供简单的解决方案。非常好用! - Matthew Setter
这个解决方案适用于ZF1,但不适用于ZF2,请参见我的其他答案。 - klodoma
在使用zf2后,我将数组合并后无法正常工作。 - vidur punj

13

第一个答案可能适用于ZF1,但在Zend Framework 2中不起作用:

$data = array(1,3,4);
$select->where('status_id IN(?)', $data);

在我发现的Zend Framework2中,我发现你必须使用:

$data = array(1,3,4);
$select->where(array('status_id' => $data));

结果:

WHERE `status_id` IN ('1', '3', '4')

我在任何地方都找不到这个记录!ZF文档通常不太理想。


是的,我可以确认第一个答案:$select->where('status_id IN(?)', $data); 在ZF1中确实有效。 - Vlado

8
显然这非常简单...我真是太蠢了:
$select->where('status_id IN(1,3,4)');

抱歉:(

2
我们可以在模型内使用Zend\Db\Sql\Predicate\InZend\Db\Sql\Where,以创建一个where in查询。
$this->status_ids = array(1,3,4);

// select attributes from db by where in 
$result = $this->select(function (Select $select) {
   $predicate = new In();
   $select->where(
      $predicate->setValueSet($this->status_ids)
                ->setIdentifier('status_id')
      );
})->toArray();

1
$completionNo = implode(",",$data);

$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$select = $db->select()->from(array("p"=>PREFIX . "property_master"),array('id','completion_no','total_carpet_area'))->where("p.completion_no IN (?)", $completionNo);

0
This solution works well with zf2     
 $ids = array('1', '2', '3', '4', '5', '6', '7', '8');
 $select->where(array("app_post_id"=> $ids));

或者

 $ids = array('1', '2', '3', '4', '5', '6', '7', '8');
    $sql = new Sql($this->adapter);
        $select = $sql->select();
        $select->from('app_post_comments');
        $select->where(array("app_post_id"=> $ids));

//        echo $select->getSqlString($this->adapter->getPlatform());
//        exit;
        $statement = $sql->prepareStatementForSqlObject($select);
        $result = $statement->execute();
        $resultSet = new ResultSet();
        $resultSet->initialize($result);
        $resultSet->buffer()->toArray();
        echo '<pre>';
        print_r($resultSet);
        exit;
        return $resultSet;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接