FuelPHP の ORM\Model での find(‘all’) について

この記事は公開されてから8年経過しています。現在とは内容が異なる場合がありますのでご注意ください。
最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。

FuelPHP 使ってますか?
今回はORM\Model を使っている時に find(‘all’) したときにつまづいたポイントをご紹介します。

とあるテーブルで find(‘all’) をしても結果レコードが1件しか取得されずおかしいなということに気が付きました。

このテーブルは郵便番号が入っているもので、郵便番号から住所検索するときに使うつもりでいました。通常は1つの郵便番号にたいして1つの住所情報だとおもうのですが、中には1つの郵便番号で60件くらいの住所が割り当てられていることもあります。

このとき、「複数の住所にマッチしたらその一覧を表示してユーザーに選択してもらう」というのをしたかったんですね。

モデルクラスで次のようなことをしてマッチしたレコードを全件取得できるつもりでした。

これで全件取得のはずでしたが、なぜか1件だけしか取得されないという事態に。

実はこのテーブルはこんな感じに主キー(primary key) を設定していなかったんですね。

ORM\Query クラスの hydrate() メソッドでは pk をキーにして配列を返すので、pk がないと2件目以降は配列に入ってこなかったのです。

テーブルに pk を追加して migrate しなおしたら問題なくマッチしたレコード全件を取得できるようになりました。