* JOIN [#i32c2190]

 $c = new Criteria();
 $c->add(GoodsPeer::ID, 123);
 $c->addJoin(GoodsPeer::CATEGORY_ID, CategoryPeer::ID, Criteria::INNER_JOIN);
                                    
 $rows = GoodsPeer::doSelectDetail($c, $this->con);

- 以上のようにaddJoin()でJOINを含んだSQLを発行出来るが、リレーションしているテーブル(この場合categoryテーブル)のカラムを参照出来ない。
- よって、GoodsPeerクラスにdoSelectDetail()メソッドを追加し、JOINする場合はこのメソッドを使うようにする。

  class GoodsPeer extends BaseGoodsPeer
  {
     public static function doSelectDetail($criteria, $con = null) {
         parent::addSelectColumns($criteria);
         
         $criteria->addSelectColumn(CategoryPeer::CATEGORY_NAME);
 
        return GoodsPeer::populateDetailObjects(GoodsPeer::doSelectStmt($criteria, $con));
     }
  
     public static function populateDetailObjects($stmt) {
         $results = array();
  
         $class = GoodsPeer::getOMClass();
         $class = Propel::importClass($class);
         $classDetail = $class."Detail";
         while($row = $stmt->fetch(PDO::FETCH_NUM)) {
             $obj = new $classDetail();
             $obj->hydrate($row);
         }              
                         
         return $obj;
     }
 
  }

- 以上がGoodsPeerクラス。
- doSelectDetail()メソッド内でdoSelectStmt()を実行し、結果をpopulateDetailObjects()に渡す。
- populateDetailObjects()で新しいクラスを作成し、そのインスタンスにhydrate()で値をポピュレートしている。

** 参考 [#n8cd8a3f]
- http://www.centsys.jp/service/technical_information/symfony/detabase/20080214.html
- http://www.propelorm.org/wiki/Documentation/1.3/Upgrading

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS