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