So erstellen Sie eine WHERE IN-Klausel mit Zend_Db_Select

68

Also versuche ich so etwas zu erreichen:

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

mit Zend_Db_Select ... kann nicht finden, wie es geht :( Ist es überhaupt möglich?

Xelurg
quelle

Antworten:

175

Sie können es auch so verwenden:

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

Sie müssen kein Array implodieren, und es ist sicherer

Martin Rázus
quelle
12
Googelte dieses Problem und fand Ihre Lösung - dann wurde mir klar, dass ich es bereits einmal positiv bewertet hatte. Da ich Sie also nicht noch einmal bewerten kann, nehmen Sie diesen Kommentar als mein Zeichen der Wertschätzung!
Lauch
So viele Variationen der Paramaterisierung von INs, danke, dass Sie mir einen Abend mit Google Glopping erspart haben!
Alan Storm
Martin, ich hatte es mit implodieren versucht, aber gesehen, dass die ganze Zeichenfolge zitiert wurde. Vielen Dank für die Bereitstellung einer einfachen Lösung. Klappt wunderbar!
Matt Setter
Diese Lösung funktioniert für ZF1, aber nicht für ZF2, siehe meine andere Antwort.
Klodoma
Funktioniert nicht für mich, nachdem das Array implodiert wurde. mit zf2
vidur punj
13

Die erste Antwort funktioniert wahrscheinlich in ZF1, aber in Zend Framework 2 nicht:

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

Für das Zend Framework2 habe ich herausgefunden, dass Sie Folgendes verwenden müssen:

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

Ergebnis:

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

Ich konnte das nirgendwo dokumentiert finden! Die ZF-Dokumentation ist im Allgemeinen nicht optimal.

Klodom
quelle
Ja, ich kann bestätigen, dass die erste Antwort: $ select-> where ('status_id IN (?)', $ Data); funktioniert wirklich in ZF1
Vlado
8

anscheinend ist es super einfach ... dumm von mir:

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

:(

Xelurg
quelle
2

Wir können Zend\Db\Sql\Predicate\Inmit verwenden Zend\Db\Sql\Where, um eine Where-in- Abfrage innerhalb eines Modells zu erstellen.

$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();
Malaiisch M.
quelle
2
This solution works well with zf2     
 $ids = array('1', '2', '3', '4', '5', '6', '7', '8');
 $select->where(array("app_post_id"=> $ids));

oder

 $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
quelle
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);
Manoj Bhambere
quelle