フォームに入力されたデータをDBに登録する際に、そのままでは登録できず、一度変換したりしたい場合があります。
例えば、checkboxのデータやselectのmultipleなど複数のデータが飛んできた場合、配列型で取得するためDBにはそのままでは登録できなかったりします。
その時は一度PHPのserialize()で値の保存可能な表現を生成してDBにします。
今回はスポーツチームで受け入れている選手の性別を登録するとし、男性、女性、両方という種別にするとして、男性、女性と二つ用意するとします。
どちらかが選ばれると配列でデータが飛んでくるので、そのデータをserialize()でDBに登録可能なデータに変換します。
// 特定のフォーム項目データを取得
$type = $this->request->getData("type");
// serialize()でDB登録可能データに変換し、POSTデータに戻す
$this->request = $this->request->withData('type', serialize($type));
こうすることで、DBに選択された種別データを登録することが可能になります。
取り出し
$this->request->getData("項目名");
上書き
$this->request->withData('項目名', '上書きするデータ');
今度は編集する場合ですが、DBから取り出したデータをフォームに適応して、既に選ばれた状態にしたいわけですが、当然このままでは不可能です。そのデータを配列型に戻す場合は、unserialize()という関数を利用します。
// $team という変数は、DBから$idで参照して取り出したデータとします
if(!empty($team['type'])) {
$team['type'] = unserialize($team['type']);
}
$this->set(compact('team'));
こうしてデータを配列型に戻してデータを引き渡すことができます。
ちなみに、必ず男性女性どちらかのデータが入っているようにするはずな為、あまり対策をする必要はないと思いますが、仮にどちらも選択していない場合がある対策として、if文で!empty()を利用して、データが空の場合を用意しておくと良いかと思います。