フォームに入力されたデータを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()を利用して、データが空の場合を用意しておくと良いかと思います。