トップ » サービス » 技術情報 » symfony » データベース・SQL(Criteria) » JOINしたテーブルのデータをSELECTする
symfony

JOINしたテーブルのデータをSELECTする - 記述日2008/2/14 - 綿引


JOINしたテーブルのデータをSELECTする

★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);
        }
    }
}


symfony 最新記事

↑Pagetop