69

So I am trying to accomplish something like this:

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

using Zend_Db_Select... can't find how to do it :( Is it at all possible?

xelurg
  • 4,294
  • 9
  • 35
  • 37

6 Answers6

181

you can also use it like this:

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

you dont need to implode array, and it's safer

Martin Rázus
  • 4,615
  • 5
  • 30
  • 33
  • 13
    Googled this problem and found your solution - then realized I had already upvoted it once. So since I can't upvote you again, take this comment as my token of appreciation! – leek Apr 15 '10 at 02:07
  • So many variations on paramaterizing INs, thanks for saving my an evening of using google glopping! – Alana Storm Oct 15 '10 at 00:28
  • Martin, I'd tried with implode, but saw that the whole string was quoted. thanks for providing a simple solution. Works like a charm! – Matthew Setter Sep 11 '11 at 08:27
  • This solution works for ZF1 but not for ZF2, see my other answer. – klodoma Sep 27 '14 at 09:46
  • Not working for me after imploding the array. using zf2 – vidur punj Apr 02 '18 at 13:05
13

The first answer probably works in ZF1 but it doesn't work in Zend Framework 2:

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

In case the Zend Framework2 I found out that you have to use:

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

Result:

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

I couldn't find this documented anywhere! ZF documentation is generally sub-optimal.

klodoma
  • 4,181
  • 1
  • 31
  • 42
  • Yes, I can confirm that the first answer: $select->where('status_id IN(?)', $data); really works in ZF1 – Vlado Mar 27 '17 at 07:14
8

apparently it is super simple... stupid me:

$select->where('status_id IN(1,3,4)');

:(

xelurg
  • 4,294
  • 9
  • 35
  • 37
2

We can use Zend\Db\Sql\Predicate\In with Zend\Db\Sql\Where to make a where in query inside a model.

$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();
Malay M
  • 1,659
  • 1
  • 14
  • 22
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);
Peter Brown
  • 50,956
  • 18
  • 113
  • 146
0
This solution works well with zf2     
 $ids = array('1', '2', '3', '4', '5', '6', '7', '8');
 $select->where(array("app_post_id"=> $ids));

or

 $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;
vidur punj
  • 5,019
  • 4
  • 46
  • 65