Ich habe vor kurzem begonnen, Zend Framework (1.8.4) zu verwenden, um Admin-Tools zum Anzeigen der Bestellungen einer Warenkorb-Website bereitzustellen.Zend: Zwei Objekte, eine Zeile
Ich möchte effizient mehrere Modellobjekte (Zend_Db_Table_Row_Abstract
) aus einer einzelnen Datenbankergebniszeile erstellen. Die Beziehung ist einfach: eine Bestellung hat einen Kunden (Fremdschlüssel order_custid=customer.cust_id
); ein Kunde hat viele Bestellungen.
Das Laden der Bestellungen ist einfach genug. die Methode hier dokumentiert werden:
Modeling objects with multiple table relationships in Zend Framework
... Ich kann dann die Kunden für jeden greifen.
foreach ($orderList as $o)
{
cust = $o->findParentRow('Customers');
print_r ($cust); // works as expected.
}
Aber wenn Sie eine lange Liste von Aufträgen Laden - sagen wir, 40 oder mehr, ein pageful - das ist schmerzlich langsam.
Weiter habe ich versucht, eine JOIN:
$custTable = new Customers();
$orderTable = new Orders();
$orderQuery = $orderTable->select()
->setIntegrityCheck(false) // allows joins
->from($orderTable)
->join('customers', 'cust_id=order_custid')
->where("order_status=?", 1); //incoming orders only.
$orders = $orderTable->fetchAll($orderQuery);
Das ist mir eine Reihe von Auftragsobjekten gibt. print_r($orders)
zeigt, dass jeder von ihnen die Spaltenliste enthält, die ich in einem geschützten Member mit den rohen Feldnamen order_ * und cust_ * erwarte.
Wie aber ein Customer-Objekt aus den cust_ * -Feldern, die ich in jedem dieser Order-Objekte finde, zu erstellen?
foreach ($orders as $o) {
$cols = $o->toArray();
print_r ($cols); // looks good, has cust_* fields...
$cust = new Customer(array('table' => 'Customer', 'data' => $cols));
// fails - $cust->id, $cust->firstname, etc are empty
$cust->setFromArray($cols);
// complains about unknown 'order_' fields.
}
Gibt es eine gute Möglichkeit, ein Auftrags- und ein Kundenobjekt gleichzeitig aus den verknüpften Zeilen zu erstellen? Oder muss ich die Abfrage ohne das Tabellen-Gateway ausführen, ein Rohergebnis erhalten und jedes der Felder eins nach dem anderen in neu erstellte Objekte kopieren?
Soweit ich weiß Zend_Db macht das nicht. Ich wäre auch sehr an einer Lösung interessiert. – markus