数学やプログラミングや映画など

新米SEがwebと数学と映画についてつらつら書きたいブログです。

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とかのそれっぽい名前を使うときは注意ですね。