[Doctrine]リレーションを使ってViewに項目を表示させる

技術メモです。
変数名やテーブル名がhogeではなく以下の様になっているのは

完全に私の趣味だ(キリッ

ではではさっそく。

先ずはschema.ymlの定義から
≪schema.yml≫

KneeHighGirl:
  connection: doctrine
  tableName: knee_high_girl
  columns:
    id:
      type: integer(8)
      fixed: false
      primary: true
      autoincrement: true
      .......中略
  relation:
    Girl:
      type: one
      local: girl_id
      foreign: id



書き終わったら、次に/lib/model/base/の中にあるBase.classにschemaに記述した通りに以下を追加する
ちなみに、相手先データが単数の場合はhasOneですが、
相手先が多の場合にはhasManyになるので注意して下さいね

≪BaseKneeHighGirl.class.php≫
    public function setUp()
    {
        parent::setUp();
        $this->hasOne('Girl', array(
             'local' => 'girl_id',
             'foreign' => 'id'));
    }




そしてリレーションで設定した項目を取得するためのメソッドやらを
/lib/model/KneeHighGirlTable.classで定義しましょう
≪KneeHighGirlTable.class.php≫
class KneeHighGirlTable extends Doctrine_Table
{

    public static function getInstance()
    {
        return Doctrine_Core::getTable('KneeHighGirl');
    }

    public function getKneeHighGirlsWithParams($params = null)
    {
        //ここでKneeHighGirlテーブルのレコードを全て取得
        //エイリアスでkhgを指定
        //その後は取得条件をleftJoinで追加していく宜し
        $query = $this->createQuery('khg');
        
        //ここでkhgに対するリレーションを辿ってレコードを取得
        //KneeHighGirlテーブル⇒Girlテーブル
        $query->leftJoin('khg.Girl gl');
        //ここでGirlからさらにリレーションを辿ったレコードを取得
        //Girlテーブル⇒Humanテーブル
        $query->leftJoin('gl.Human hmn');
        
        $query->orderBy('khg.id DESC');
        return $query;
    }
}



此処までいったら下準備は完了です
実際にActionで、pagerにセットする様に記述していきます
≪action.class.php≫
$this->pager = new sfDoctrinePager('KneeHighGirl');
    $this->pager->setQuery(Doctrine::getTable('KneeHighGirl')->getKneeHighGirlsWithParams($Params));
    $this->pager->setPage($request->getParameter('page', 1));
    $this->pager->init();
    $this->kneeHighGirls = $this->pager->getResults(Doctrine::HYDRATE_ARRAY);




奴は四天王の中でも最弱・・・
もう終わったも同然
食ってやるわ!!!!!!!!
view側でそれを受けてforeachで回して、セットするだけ
左手も添えるだけ
≪index.phpとかView側≫
foreach ($kneeHighGirls as $kneeHighGirl){
    <tr>
      <th>性別</th>
      <td><?php echo $kneeHighGirl['Girl']['Human']['sex'] ?></td>
    </tr>
}
[‘Girl’]・・・KneeHighGirl⇒Girlへのリレーション
※schema.ymlで定義した名前
[‘Human’]・・・Girl⇒Humanへのリレーション
※schema.ymlで定義した名前
[‘sex’]・・・Humanテーブルの中のカラム

こんな感じで、存外簡単に取得できる事が判ります
もともと、リレーションをなぜか使わない方向でやっていたのですが
pagerにセットする辺り、こうせざるを得なかったので。

大体1時間程度で解読できたのが、救いですな・・(*´ω`)w


  1. コメントはまだありません。

  1. トラックバックはまだありません。