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?

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


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.


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)');

:(


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();

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;

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.