CakePHP(1.1) の Model::generateList メソッド

(使い方は http://book.cakephp.org/ja/view/455/generateList をご覧下さい)
は、DBから簡単にキーと値の組み合わせのリストを生成してくれるので、大変重宝しております。
さて、使うにつれて、valuePath項目(値の方)に、2フィールドの値を連結して設定したくなります。
いろいろ調べたのですが、方法がわかりません。
どなたかご存知の方はいらっしゃいませんでしょうか?
よろしくお願い致します。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2009/03/19 15:15:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:tdoi No.1

回答回数174ベストアンサー獲得回数75

ポイント60pt

期待されている回答ではない気がしますが、コメントがあいていないのでこちらで失礼します。

おそらく、

$this->Model->generateListCombine(・・・・, array('column1', 'column2'));

のような形で、

array(1 => 'valueOfColumn1valueOfColumn2',
      2 => 'valueOfColumn1valueOfColumn2');

というようなデータを作成したいのだと思いますが、認識は正しいでしょうか?

結論からすると、該当する機能は提供されていないはずです。


というだけではなんなので、これを実現するとすると、以下のどれかかなと思います。

動作確認してないので、雰囲気だけつかんでもらえればという感じですが。

1.地道にControllerで作成する。

$items = $this->findAll(・・・);
$list = array();
foreach ($items as $item) {
  $list[] = $item['Model']['column1'] . $item['Model']['column2'];
}

2.ControllerでgenerateListを複数回実行してマージする。

$list1 = $this->generateList($conditions, $order,$limit, $keyPath, $valuePath1);
$list2 = $this->generateList($conditions, $order,$limit, $keyPath, $valuePath2);
$list = array();
foreach ($item1 as $key => $value) {
  $list[$key] = $value . $list2[$key];
}

参考

http://www.syuhari.jp/blog/archives/124


3.Modelに関数を追加する。

AppModel、あるいは、実際に作成したModelに複数カラムをマージしたリストを返す関数を作成する。

CakePHP1.2系列であれば、Behaviorとかにしてしまうと、Happyな人もいるかもですが、1.1だと、Modelに記述することになりそうですね。


4.フレームワークを拡張する。

実際に処理を行っているのは、model_php5.phpなどで定義されているgenerateListなので、これを上書きします。

app/model/model_php5.phpなどにコピーをおいて、編集したいところですが、ここではできないので、cake/libs/model/model_php5.phpを編集して、$vlauePathに配列を許可して、Set::extractを複数回してつなげる。

とかでしょうか。このあたりは、他での利用とかにもよるので、なんとも言えませんが。


5.Model::queryを使う

$list = $this->Model->query("SELECT id, CONCAT(column1, column2) ・・・");

あとはお好きなように・・・



どれを選ぶかですが、状況次第としか言えないです。

個人的には、いろんな箇所で需要があれば、4を選ぶと思います。

そうでなくて、特定のモデルだけであれば、3をとると思います。

テスト実装程度でよいのであれば、1を選びます。

2はまず選ばないですね。キャッシュが効くので問題ないと思いますが、パフォーマンス的にも無駄が多い気がしますし。

一番効率がよいのは5でしょう。最後の手段にすると思いますが。


何かの参考になれば。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません