Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie führt man eine verbundene Abfrage in der ZF-Tabellenschnittstelle durch?

$models = new Models();
$select = $models->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
$select->setIntegrityCheck(false)
       ->join(array("a"=>"manufacturers"), 'models.manufacturer_id = a.id',
         array("man_name"=>"name", "man_description"=>"description"))
       ->where("a.name LIKE 'A%'");
$rowset = $models->fetchAll($select);

Leider die Zend_Db_Table Das Relationships-Interface hat nicht viel Intelligenz in Bezug auf das Erstellen verbundener Abfragen aus seiner deklarierten Referenzkarte. Die von der Community bereitgestellte Lösung für komplexe Abfragen ist Zend_Db_Table_Select Abfrage Fabrik.

Beachten Sie, dass Sie Spaltenaliase für den Namen und die Beschreibung des Herstellers angeben müssen, da diese Spalten sonst den Modellnamen und die Beschreibung im assoziativen Array für die Zeilendaten unterdrücken. Um dies zu vermeiden, sollten Sie Spalten eindeutig benennen.

Aber in Ihrem Fall würde ich die Tabellenschnittstelle und die Auswahlschnittstelle überspringen und einfach eine SQL-Abfrage direkt mit dem Db-Adapter ausführen:

$data = $db->fetchAll("
  SELECT m.*, a.name AS man_name, a.description AS man_description
  FROM Models m JOIN Manufacturers a ON m.manufacturer_id = a.id
  WHERE a.name LIKE 'A%'");

Sie erhalten die Daten als einfaches Array assoziativer Arrays zurück, nicht als Zend_Db_Table_Rowset . Aber da ein verbundenes Rowset sowieso nicht beschreibbar ist, haben Sie nicht viel geopfert.