5

最近、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つずつ新しく作成されたオブジェクトにコピーする必要がありますか?

4

2 に答える 2

1

このメソッドを使用して、データベースの行フィールドをオブジェクトに割り当てます。私はsetterメソッドを使用していますが、これはおそらくオブジェクトのプロパティのみを使用して実行することもできます。

public function setOptions(array $options){
    $methods = get_class_methods($this);
    foreach ($options as $key => $value) {
        $method = 'set' . ucfirst($key);
        if (in_array($method, $methods)) {
            $this->$method($value);
        }
   }
   return $this;
}
于 2009-08-11T19:58:07.550 に答える
1

Zend_Dbこれを行うための便利な方法は提供していません。

仮に、複数のテーブルから派生する行にファサードパターンを使用するのは便利です。ファサードクラスは、どの列がそれぞれのテーブルに属しているかを追跡します。メソッドを使用して個々のフィールドまたはフィールドの束全体を設定するとsetFromArray()、ファサードは、フィールドを各テーブルのRowオブジェクトにマップし、UPDATE影響を受けるテーブルにステートメントを適用する方法を認識します。

または、サブクラス化して、例外をスローする代わりに不明な列をサイレントに無視するように動作をZend_Db_Table_Row_Abstract変更することで、不明なフィールドの問題を回避することもできます。__set()

SQLが実行できるすべてのことを実行するためのオブジェクト指向インターフェースを持つことはできません。一般的なケースの合理的なセットがカバーされていると判断する線が砂の中にある必要があり、より複雑なものはSQLで実行する必要があります。

于 2009-08-11T21:58:48.680 に答える