この記事は公開されてから8年経過しています。現在とは内容が異なる場合がありますのでご注意ください。
最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。
最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。
FuelPHP 使ってますか?
今回はORM\Model を使っている時に find(‘all’) したときにつまづいたポイントをご紹介します。
とあるテーブルで find(‘all’) をしても結果レコードが1件しか取得されずおかしいなということに気が付きました。
このテーブルは郵便番号が入っているもので、郵便番号から住所検索するときに使うつもりでいました。通常は1つの郵便番号にたいして1つの住所情報だとおもうのですが、中には1つの郵便番号で60件くらいの住所が割り当てられていることもあります。
このとき、「複数の住所にマッチしたらその一覧を表示してユーザーに選択してもらう」というのをしたかったんですね。
モデルクラスで次のようなことをしてマッチしたレコードを全件取得できるつもりでした。
1 2 3 4 5 6 7 |
$records = self::find('all', array('where' => $zip_code)); $results = array(); foreach ($records as $record) { array_push($results, $record->to_array()); } return $results; |
これで全件取得のはずでしたが、なぜか1件だけしか取得されないという事態に。
実はこのテーブルはこんな感じに主キー(primary key) を設定していなかったんですね。
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE IF NOT EXISTS `zip_code` ( `zip_code` varchar(7) NOT NULL, `prefecture` varchar(255) NOT NULL, `city` varchar(255) NOT NULL, `area` varchar(255) NOT NULL, `prefecture_kana` varchar(255) NOT NULL, `city_kana` varchar(255) NOT NULL, `area_kana` varchar(255) NOT NULL, KEY `i_zip_code` (`zip_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
ORM\Query クラスの hydrate() メソッドでは pk をキーにして配列を返すので、pk がないと2件目以降は配列に入ってこなかったのです。
テーブルに pk を追加して migrate しなおしたら問題なくマッチしたレコード全件を取得できるようになりました。