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.