プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
FuelPHP1.6、ORMモデルのfind('first')、find('last')を使うときの注意事項。
結論から言うと、find('first')、find('last')を使うときは

ORDER BYの指定にプライマリキーを入れちゃダメ。ゼッタイ。

です。

まずはこちらを見てくださいなφ(--)

■ 最初の一行を取得
$result = Model_Test02::find('first');
var_dump($result);
SELECT (取得項目) FROM `tbl_test01` AS `t0` ORDER BY `t0`.`pk_id` ASC LIMIT 1

■ 最後の1行を取得
$result = Model_Test02::find('last');
var_dump($result);
SELECT (取得項目) FROM `tbl_test01` AS `t0` ORDER BY `t0`.`pk_id` DESC LIMIT 1

どうやら「find('first')」ではプライマリキーを昇順に並べて1件目を取得、
「find('last')」ではプライマリキーを降順に並べて1件目を取得、としているようなのです。

だから自前でプライマリキーを含むorder by句をくっつけてしまうと
予期せぬ動作……というかぶっちゃけ'first'と'last'の結果が同じになってしまいます。

こんな感じφ(--)

■ 最初の1件を取得
$result = Model_Test02::find('first', array(
    'order_by' => array(
        'pk_id',
    ),
));
var_dump($result);
SELECT (取得項目) FROM `tbl_test01` AS `t0` ORDER BY `t0`.`pk_id` ASC, `t0`.`pk_id` ASC LIMIT 1

■ 最後の1件を取得
$result = Model_Test02::find('last', array(
    'order_by' => array(
        'pk_id',
    ),
));
var_dump($result);
SELECT (取得項目) FROM `tbl_test01` AS `t0` ORDER BY `t0`.`pk_id` ASC, `t0`.`pk_id` DESC LIMIT 1

ちなみに複合主キーの場合も理屈は同じでした。

■find('first')
ORDER BY [指定したソート順], [プライマリキー1 ASC, プライマリキー2 ASC …]

■find('last')
ORDER BY [指定したソート順], [プライマリキー1 DESC, プライマリキー2 DESC …]

な仕様で、例え[指定したソート順]内にプライマリキーがあった場合でも
気にしないで[プライマリキー1 …]をくっつけるようですね。

個人的には「find('all')」で明示的に並び順と取得件数を指定する方が好きなのですが
「find('first')」「find('last')」が好きな方はご注意ください。

完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:FuelPHP  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事