コメントでPOSTデータの受け取りが問題かもしれないというご指摘があったので、回答のコードにPOSTの受け取り方を追加して全面的に編集しました。ご指摘ありがとうございます。
https://book.cakephp.org/3.0/ja/controllers/request-response.html#Cake\Http\ServerRequest::getData
※注意点
<input name="data[Encode][bc_category_id]">
のようにHTMLフォームを組んでいると、data
が切り取られて連想配列に格納されます。
また、質問文のコードを見るとCakePHP2のバージョンのような気がするので、両方の書き方を載せておきます。最初に回答したコードはCakePHP3用のコードです(本回答末尾に追記移動)。
save()メソッドのバージョンによる違い
save()
メソッドの引数にはCakePHP2では連想配列を入れることができますが、CakePHP3ではオブジェクトが入ります。
https://book.cakephp.org/2.0/ja/models/saving-your-data.html#model-save-array-data-null-boolean-validate-true-array-fieldlist-array
https://book.cakephp.org/3.0/ja/orm/saving-data.html
CakePHP2
HTMLの組み方によりますが下記のようにしている場合は、$this->request->data('Encode')
で必要なデータをとれるので下記のように書けます。質問文のHTMLコードはこれに近いかと思いましたので。
html
1<input type="checkbox" name="data[Encode][bc_category_id]" value="xxx">
2...
3<input type="text" name="data[Encode][other]" value="xxx">
php
1public function ~~ (){
2//...
3 //POSTデータ
4 $post = $this->request->data('Encode'); //v4で削除予定
5 //チェックボックスのPOSTデータ(個別に取り出す)
6 //$categories = $this->request->data('Encode.bc_category_id');
7
8 //新規追加
9 $this->Encode->create();
10 //更新
11 //$this->Encode->read(null, プライマリーキーのID値); //DBの特定の行の更新なので
12
13 $data = array();
14
15 if ($post) {
16 //チェックボックスのPOSTデータ
17 if(!empty($post['bc_category_id'])){
18 //JSON形式で保存???
19 $data['カラム名1'] = json_encode($post['bc_category_id'], JSON_UNESCAPED_UNICODE);
20 }
21 //他のPOSTデータ
22 if(!empty($post['other'])){
23 $data['カラム名2'] = $post['other'];
24 }
25 }
26
27 //データセットは下記のようにも書けます
28 //$this->Encode->set(array(
29 // 'カラム名' => 'データ',
30 // ...
31 //));
32 //$this->Encode->save();
33
34 //DB保存
35 $this->Encode->save($data);
36}
CakePHP3
$this->request->getData('Encode')
で必要なデータをとれるので下記のように書けます。$this->request->data()
も引き続き使えますが、CakePHP4で削除予定だそうです。
モデルの使い方は、CakePHP2よりも大幅に機能が追加され、書き方もいろいろできるようになってます。
php
1use Cake\ORM\TableRegistry;
2
3public function ~~ (){
4//...
5 //POSTデータ
6 $post = $this->request->getData('Encode');
7 //チェックボックスのPOSTデータ(個別に取り出す)
8 //$categories = $this->request->getData('Encode.bc_category_id');
9
10 $encodeTable = TableRegistry::get('Encode');
11
12 //新規追加
13 $encode = $encodeTable->newEntity();
14 //更新
15 //$encode = $encodeTable->get(プライマリーキーのID値); //DBの特定の行の更新なので
16
17 if ($post) {
18 //チェックボックスのPOSTデータ
19 if(!empty($post['bc_category_id'])){
20 //JSON形式で保存???
21 $encode->カラム名1 = json_encode($post['bc_category_id'], JSON_UNESCAPED_UNICODE);
22 }
23 //他のPOSTデータ
24 if(!empty($post['other'])){
25 $encode->カラム名2 = $post['other'];
26 }
27 }
28
29 //DB保存
30 $encodeTable->save($encode);
31}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/12/29 02:20
2018/01/05 09:09
2018/01/26 12:17
2018/01/29 04:22 編集