★JOINした先のテーブルのデータをSELECTする方法
デフォルトで使えるcriteriaのaddJoinメソッドとpropelのdoSelectメソッドの組み合わせでは、
JOINした先のテーブルのデータがSELECTできないっぽい。
例:決済トランに会員マスタをJOINしても、会員マスタのデータはSELECTできない(WHERE句に指定はできるので検索はできる)
SELECTするには、基のモデルクラスを継承した子クラスを作るしかなさそう。
アクションの記述例
$objCriteria = new Criteria();
$objCriteria->add(SettleTrnPeer::DELETE_FLG, sfConfig::get('app_flg_off'));
$objCriteria->add(SettleTrnPeer::SETTLEMENT_ID, $this->strSettlementId);
$objCriteria->addJoin(SettleTrnPeer::MEMBER_ID,MemberMstPeer::MEMBER_ID,'LEFT OUTER JOIN');
$objCriteria->addJoin(SettleTrnPeer::SITE_ID,SiteMstPeer::SITE_ID,'LEFT OUTER JOIN');
//↑↑↑JOINしたいテーブルとキーを指定する この機能はもともとある
$this->objSettle = SettleTrnPeer::doSelectDetail($objCriteria);
//↑↑↑doSelectメソッドは元々あるが、JOINした先のテーブルデータは取得できないので、doSelectDetailメソッドを新たに作る
SettleTrnPeerクラスの追記例(doSelectDetailとをpopulateDetailObjectsメソッドを追加)
class SettleTrnPeer extends BaseSettleTrnPeer
{
public static function doSelectDetail(Criteria $criteria, $con = null)
{
//SELECTするカラムの指定:決済トラン
parent::addSelectColumns($criteria);
//追加でSELECTしたいカラムの指定:会員マスタデータ
$criteria->addSelectColumn(MemberMstPeer::EMAIL);
$criteria->addSelectColumn(MemberMstPeer::NAME_KANJI);
$criteria->addSelectColumn(MemberMstPeer::NAME_KANA);
$criteria->addSelectColumn(MemberMstPeer::ZIP_CODE);
$criteria->addSelectColumn(MemberMstPeer::PREFECTURE);
$criteria->addSelectColumn(MemberMstPeer::CITY_NAME);
$criteria->addSelectColumn(MemberMstPeer::CITY_ADDRESS);
$criteria->addSelectColumn(MemberMstPeer::BUILDING_NAME);
$criteria->addSelectColumn(MemberMstPeer::TELEPHONE);
$criteria->addSelectColumn(MemberMstPeer::ADULT_FLG);
//追加でSELECTしたいカラムの指定:サイトマスタデータ
$criteria->addSelectColumn(SiteMstPeer::SITE_NAME);
//doSelectRSで取得した配列をpopulateメソッドでオブジェクト化する
return SettleTrnPeer::populateDetailObjects(SettleTrnPeer::doSelectRS($criteria, $con));
//↑既存のpopulateObjectsメソッドだと追加分のSELECTデータをオブジェクト化してくれないので、これまた自分で作る
}
//オブジェクト化メソッド
public static function populateDetailObjects(ResultSet $rs)
{
$results = array();
$cls = SettleTrnPeer::getOMClass();
$cls = Propel::import($cls);
$cls = $cls."Detail";
//↑オブジェクトクラス名 通常はSettleTrnだが、SettleTrnクラスを継承したSettleTrnDetailクラスを新しく作る
while($rs->next()) {
$obj = new $cls();
$obj->hydrateDetail($rs);
//配列内のデータをオブジェクトのメンバに加える
}
return $obj;
}
}
SettleTrnDetailクラスの追記例
class SettleTrnDetail extends SettleTrn
{
//追加で取得するデータのゲッター・セッターを書く(省略)
//オブジェクトのメンバに追加で取得するデータを追加する
public function hydrateDetail(ResultSet $rs, $startcol = 1)
{
try {
$startcol = parent::hydrate($rs);
//会員マスタデータ分を追加
$this->email = $rs->getString($startcol + 0);
$this->name_kanji = $rs->getString($startcol + 1);
$this->name_kana = $rs->getString($startcol + 2);
$this->zip_code = $rs->getString($startcol + 3);
$this->prefecture = $rs->getString($startcol + 4);
$this->city_name = $rs->getString($startcol + 5);
$this->city_address = $rs->getString($startcol + 6);
$this->building_name = $rs->getString($startcol + 7);
$this->telephone = $rs->getString($startcol + 8);
$this->adult_flg = $rs->getBoolean($startcol + 9);
//サイトマスタデータ分を追加
$this->site_name = $rs->getString($startcol + 10);
} catch (Exception $e) {
throw new PropelException("Error populating SettleTrn object", $e);
}
}
}

