最近、Zend Framework(1.8.4)を使用して、ショッピングカートサイトの注文を表示するための管理ツールを提供し始めました。
私がやりたいのはZend_Db_Table_Row_Abstract
、単一のデータベース結果行から複数のモデル()オブジェクトを効率的に作成することです。
関係は単純です。注文には1人の顧客(外部キーorder_custid=customer.cust_id
)があります。顧客には多くの注文があります。
注文の読み込みは簡単です。ここに記載されている方法を使用します。
ZendFrameworkでの複数のテーブル関係を持つオブジェクトのモデリング
...その後、それぞれの顧客をつかむことができました。
foreach ($orderList as $o)
{
cust = $o->findParentRow('Customers');
print_r ($cust); // works as expected.
}
しかし、注文の長いリスト(たとえば、40以上、1ページ)をロードする場合、これは非常に遅くなります。
次に、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);
これにより、注文オブジェクトの配列が得られます。 print_r($orders)
は、保護されたメンバーに、生のフィールド名order_*およびcust_*を持つ列リストがそれぞれに含まれていることを示しています。
しかし、これらの各Orderオブジェクトにあるcust_ *フィールドからCustomerオブジェクトを作成するにはどうすればよいですか?
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.
}
結合された行からOrderオブジェクトとCustomerオブジェクトを同時に作成する良い方法はありますか?または、テーブルゲートウェイなしでクエリを実行し、生の結果セットを取得して、各フィールドを1つずつ新しく作成されたオブジェクトにコピーする必要がありますか?