(使い方は http://book.cakephp.org/ja/view/455/generateList をご覧下さい)
は、DBから簡単にキーと値の組み合わせのリストを生成してくれるので、大変重宝しております。
さて、使うにつれて、valuePath項目(値の方)に、2フィールドの値を連結して設定したくなります。
いろいろ調べたのですが、方法がわかりません。
どなたかご存知の方はいらっしゃいませんでしょうか?
よろしくお願い致します。
期待されている回答ではない気がしますが、コメントがあいていないのでこちらで失礼します。
おそらく、
$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でしょう。最後の手段にすると思いますが。
何かの参考になれば。
コメント(0件)