PhalconのModel間リレーションについて
こんにちは、株式会社ライオンハートの鵜飼です。
少し間を置いて、再度Phalcon PHPについてのメモです。
今回はRDBを利用する上では必ずと言っても良いほど必要性が出てくるModel間リレーションについてです。
CakePHP等ではアソシエーションとも呼ばれているようですね。
定義方法
他のFWとほぼ同じような命名で、Phalconでも定義をすることが可能です。
initialize
で初期化する際にリレーションの定義を記述します。
<?php class Foo extends Phalcon\Mvc\Model { public function initialize() { // 一対多 // 自分のID, 相手のモデル名, 相手のID $this->hasMany("id", "Bar", "fooId"); } }
<?php class Bar extends Phalcon\Mvc\Model { public function initialize() { // 多対一 // 自分のID, 相手のモデル名, 相手のID $this->belongsTo("fooId", "Foo", "id"); } }
定義の種類
それぞれの定義方法のメソッド名は下記の通りです。
- hasMany
- 一対多
- hasOne
- 一対一
- belongsTo
- 多対一
- hasManyToMany
- 多対多
hasMany
とbelongsTo
、
hasOne
とhasOne
、
hasManyToMany
とhasManyToMany
で対に設定する感じでしょうか。
リレーションのデータを表示する
最後に、リレーションされているデータを表示してみます。
hasMany
でも、hasOne
だとしても、モデル名で変数が追加されています。
まずはhasMany
でリレーションしている場合。この時は配列が含まれます。
<?php class Foo extends Phalcon\Mvc\Model { public function initialize() { $this->hasMany("id", "Bar", "fooId"); } }
<?php class FooController extends Phalcon\Mvc\Controller { public function indexAction { $this->view->foos = Foo::find(); } }
<ul> {% for foo in foos %} <li> {{ foo.name }} {% for bar in foo.bar %} <span>{{ bar.name }}</span> {% endfor %} </li> {% endfor %} </ul>
次にhasOne
の場合。この時はモデルオブジェクトがそのまま入っているのでforで回す必要はありません。
<?php class Foo extends Phalcon\Mvc\Model { public function initialize() { $this->hasOne("id", "Bar", "fooId"); } }
<?php class FooController extends Phalcon\Mvc\Controller { public function indexAction { $this->view->foos = Foo::find(); } }
<ul> {% for foo in foos %} <li> {{ foo.name }} <span>{{ foo.bar.name }}</span> </li> {% endfor %} </ul>