ごみばこ

プログラムに関する備忘録などを書いています。

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

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

$robot = Robots::findFirst();

$robotParts = $robot->RobotParts;

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

$robot = Robots::findFirst();

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

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

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

例えば、RobotPartsを取得したいと明確に決まっているのであれば、 RobotsクラスにgetRobotParts($parameters)とメソッドを追加することで、 他人がコードを読む時に処理が追いやすくなります。 過去のドキュメントにもMagic Getters vs. Explicit methodsに記載されています。

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

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

参考URL

記事に誤り等があればコメントください。