PHP
Phalcon

【Phalcon】条件付きでリレーション先のModelオブジェクトを取得する

ORMでリレーション先のデータも取りたいことはよくあります。

マジックメソッド経由での取得方法

Phalconの場合はアローでモデル名を書くことで、
リレーション先のModelオブジェクトが取得できます。
以下ではRobotsクラスとリレーションが組まれているRobotPartsクラスの取得方法です。

$robot = Robots::findFirst();

// プロパティ形式
// __get()からgetRelationRecordsで取得を行う
$robotParts = $robot->RobotParts;

// メソッド形式
// __call()から_getRelatedRecordsで取得を行う
$robotParts = $robot->getRobotParts();

getRelated()での取得

上記で取得出来るのですが、PhalconのModelクラスには
同様の処理を行うgetRelatedメソッドが用意されています。

$robot = Robots::findFirst();

$robotParts = $robot->getRelated('RobotParts');

結果としては同じですが、以下の利点があります。

  • 実装されているメソッドの為、処理が追いやすくなる
  • プロパティ形式の取得と異なり、第2引数に取得条件を追記出来る

例えば、RobotPartsを取得したいと明確に決まっているのであれば、
RobotsクラスにgetRobotParts($parameters)とメソッドを追加することで、
他人がコードを読む時に処理が追いやすくなります。

public function getRobotParts($parameters = null)
{
    return $this->getRelated('RobotParts', $parameters);
}

過去のドキュメントにもMagic Getters vs. Explicit methodsとして記載されています。

また論理削除を適用しているテーブルに対して、
削除されていないデータのみを取得したいとなった場合、
プロパティ形式をそのまま使用すると不可能です。
しかし、getRelatedメソッドを使用することで条件に一致するデータに絞って取得が行えます。

前者の形式も便利ではあるので、状況に応じて使い分けると良いかなと思います。
個人的には処理が追いやすくなるので後者が好きです。

終わりに

PHPを書き始めて半年くらいになりそうですが、
Modelクラスを読むことで__call, __getなどのマジックメソッドを知りました・・・。

PhalconのソースコードはZephirで書かれているので、
PHPを書いている方であれば読みやすいと思いますので、読んでみるといいかもしれません。

参考URL

記事に誤り等があればコメント頂ければ幸いです