FuelPHP Model_XXX::find()->get()は注意が必要

追記 – 平成24年7月24日

find()からレコードがとれたかどうか確認するステップを無くして、
エラーを回避するがためにArrayAccessを使用するやり方は好ましくないとご指摘を頂きました。
確かにそのとおりだと思います。

この記事は、FuelPHPのORMの動きの理解につながると思いますが、
正しい方法では無いので決して使わないでください。

正しい方法はマニュアルに従って下さい。(後日ここに正しい手順で修正したものをあげときます。)

FuelPHP Monkey

// $pkがないときに処理が中断してしまう。
$name = Model_Monkey::find($pk)->get('name');

FuelPHPに含まれているORMパッケージのfindメソッドはPKが存在しないときnullを返します。

なのでそのまま続けて、メソッドチェーンで記述してしまうと、以下のエラーが出てしまいます。

Call to a member function get() on a non-object

これが出てしまうとPHPは処理を中断してしまうため色々と問題になります。

これを回避する方法

(環境はDocsに書いてあるScaffoldを使いました。FuelPHP1.2 Docs Scaffolding)

// findとgetを別々に書く方法 ←これは普通
$row = Model_Monkey::find($pk);
if ($row)
{
    $name = $row->get('name');
}

// PHP5.3 ArrayAccessインターフェースを使う方法 ←良い感じ
$row = Model_Monkey::find($pk);
$name = $row['name'];

// PHP5.4 ArrayAccessインターフェースを使う方法(未検証)
$name = Model_Monkey::find($pk)['name'];

ポイントはArrayAccessを使っていること

なぜArrayAccess

FuelPHPのORMはカラムの値を取得する方法が三種類あります。

存在しないPKでfindメソッドを実行し、
カラムの値を取得する時のエラーの比較をしてみます。

// getterメソッドを使う
// ErrorException [ Error ]: Call to a member function get() on a non-object
$name = $row->get('name');

// マジックメソッドを使う(getterが呼ばれる)
// ErrorException [ Notice ]: Trying to get property of non-object
$name = $row->name;

// ArrayAccessを使う(getterが呼ばれる)
$name = $row['name']; // エラーが出ない。

ArrayAccessを使った最後の例はエラーが出ないです。
なので、Viewで表示する時や色々な場面でこのArrayAccessを使った方法がいいとおもいます。

他にもスマートな方法がありましたら、是非教えて下さいお願いしますm(__)m
おわり。

あとがき

以下のコードはエラーになりません。
そんな特徴を活かした記事でした。

php > error_reporting(-1);
php > $row = null;
php > echo $row['name'];
php >

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です