LionHeart SD BLOG

株式会社ライオンハート システムデザインの技術ブログ

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
多対多

hasManybelongsTo
hasOnehasOne
hasManyToManyhasManyToMany
で対に設定する感じでしょうか。

リレーションのデータを表示する

最後に、リレーションされているデータを表示してみます。

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>

参考