cakephp2.xでアソシエーションを利用したデータの保存をするフォームの作成
cakephpのFormヘルパーとアソシエーションの話。
cakephpを初めて1週間程(ほんとは3ヶ月前に1週間やって挫折)の私が詰まったところ。
$hasManyされる側のフィールド名がxxx_idの際の注意点。
対象となるテーブルは以下の二つ。
playテーブル
CREATE TABLE `plays` (
`id` int(11) NOT NULL,
`play_date` date NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL
)
resultテーブル
CREATE TABLE `results` (
`id` int(11) NOT NULL,
`post_id` int(11) NOT NULL,
`member_id` int(11) NOT NULL,
`point` int(11) NOT NULL
)
playsテーブルにplays.id=results.post_idでleft joinする感じ。
1プレイ(playsテーブル)に対して4人のメンバーの得点(resultsテーブル4レコード分)に保存される。
麻雀の記録を保存するツールを作ろうと、とりあえず作ったもの。
cakephpでは上記のテーブルに対しそれぞれモデルを作成し、アソシエーションを考える。
今回はplaysテーブルに対し、resultsテーブルのレコードが4つぶら下がるので、アソシエーション名は$hasMany
Model/Play.php
----------------------------------------------------------
class Post extends AppModel {
public $hasMany = "Result";
}
-----------------------------------------------------------
そしてresultadd.ctpに戦績を挿入するフォームを作成、とりあえず一戦だけテストで入力するフォームを作成。memberテーブルはあるけど、とりあえず手動で入力するフォーム。
View/Plays/resultadd.ctp
----------------------------------------------------------
<h2>Add Result</h2>
<?php
echo $this->Form->create('Play', array('action' => 'resultadd'));
echo $this->Form->input('Play.play_date');
echo $this->Form->input('Result.0.member_id');
echo $this->Form->input('Result.0.point');
echo $this->Form->input('Result.1.member_id');
echo $this->Form->input('Result.1.point');
echo $this->Form->input('Result.2.member_id');
echo $this->Form->input('Result.2.point');
echo $this->Form->input('Result.3.member_id');
echo $this->Form->input('Result.3.point');
echo $this->Form->end('Add Result!!');
-----------------------------------------------------------
こうすると、フォームのtypeはDBのフィールドに対応したものになるはず。
つまり今回は、
echo $this->Form->input('Play.play_date'); //←date
echo $this->Form->input('Result.0.member_id');//←number
echo $this->Form->input('Result.0.point');//←number
になるはずが・・・
member_idだけnumberにならない!!
なぜか<select></select>になる!!
色々調べた結果、フィールド名がxxx_id(xxxは任意)だとtypeがセレクトになるようです。
cakephp/FormHelper.php at 2.8 · cakephp/cakephp · GitHub
自分でoptionを指定してあげると任意のtypeにできるので、渋々指定。
echo $this->Form->input('Result.0.member_id',array('type'=>'number'));
これでtypeがnumberになり一安心。
命名規約が厳しいのでidとかのそれっぽい名前を使うときは注意ですね。