JOIN

 $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()で値をポピュレートしている。

参考


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

Last-modified: 2011-08-16 (火) 18:28:40