回答編集履歴

1

POSTデータの受け取り方と、CakePHP2の書き方を追記編集

2017/12/30 08:42

投稿

Tomak
Tomak

スコア1652

test CHANGED
@@ -1,53 +1,213 @@
1
- `save(引数)`引数にはオブジェクト入ります。配列は入ることがでせん
2
-
3
- オブジェクトは下記のように**新規追加**と**更新**によって違って、DBのレコードのオブジェクトに対して、カラムプロパティを指定します。
4
-
5
-
6
-
7
- 他にもいろいろなことができますが、基本的な使い方は下記サンプルの通りです。詳細はドキュメントをみてください。
1
+ コメントでPOSTデータ受け取り問題かもしないいうご指摘あったの、回答のコードにPOSTの受け取り方を追加して全面的に編集ししたご指摘ありがとうございます。
2
+
3
+ [https://book.cakephp.org/3.0/ja/controllers/request-response.html#Cake\Http\ServerRequest::getData](https://book.cakephp.org/3.0/ja/controllers/request-response.html#Cake\Http\ServerRequest::getData)
4
+
5
+
6
+
7
+ **※注意点**
8
+
9
+ `<input name="data[Encode][bc_category_id]">`のようにHTMLフォームを組んでいると、`data`が切り取られて連想配列に格納されます。
10
+
11
+
12
+
13
+ また、質問文のコードを見るとCakePHP2のバージョンのような気がするので、両方の書き方を載せておきます。最初に回答したコードはCakePHP3用のコードです(本回答末尾に追記移動)。
14
+
15
+
16
+
17
+
18
+
19
+ #### save()メソッドのバージョンによる違い
20
+
21
+
22
+
23
+ `save()`メソッドの引数にはCakePHP2では連想配列を入れることができますが、CakePHP3ではオブジェクトが入ります。
24
+
25
+
26
+
27
+ - CakePHP2: `save(連想配列)`
28
+
29
+ [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/2.0/ja/models/saving-your-data.html#model-save-array-data-null-boolean-validate-true-array-fieldlist-array)
30
+
31
+
32
+
33
+ - CakePHP3: `save(オブジェクト)`
8
34
 
9
35
  [https://book.cakephp.org/3.0/ja/orm/saving-data.html](https://book.cakephp.org/3.0/ja/orm/saving-data.html)
10
36
 
11
37
 
12
38
 
39
+
40
+
41
+ #### CakePHP2
42
+
43
+
44
+
45
+ HTMLの組み方によりますが下記のようにしている場合は、`$this->request->data('Encode')`で必要なデータをとれるので下記のように書けます。質問文のHTMLコードはこれに近いかと思いましたので。
46
+
47
+
48
+
49
+ ```html
50
+
51
+ <input type="checkbox" name="data[Encode][bc_category_id]" value="xxx">
52
+
53
+ ...
54
+
55
+ <input type="text" name="data[Encode][other]" value="xxx">
56
+
57
+ ```
58
+
59
+
60
+
13
61
  ```php
14
62
 
15
63
  public function ~~ (){
16
64
 
17
65
  //...
18
66
 
67
+ //POSTデータ
68
+
69
+ $post = $this->request->data('Encode'); //v4で削除予定
70
+
19
- //$this->Encodeがモデルオブジェクト???
71
+ //ボックスのPOSTデータ(個別に取り出す)
20
-
72
+
21
- $this->Encode = TableRegistry::get('Encode');
73
+ //$categories = $this->request->data('Encode.bc_category_id');
22
74
 
23
75
 
24
76
 
25
77
  //新規追加
26
78
 
27
- $encode = $this->Encode->newEntity();
79
+ $this->Encode->create();
28
80
 
29
81
  //更新
30
82
 
31
- $encode = $this->Encode->get(プライマリーキーのID値); //DBの特定の行の更新なので
83
+ //$this->Encode->read(null, プライマリーキーのID値); //DBの特定の行の更新なので
84
+
85
+
86
+
32
-
87
+ $data = array();
33
-
34
-
88
+
89
+
90
+
35
- if($this->data){
91
+ if ($post) {
92
+
36
-
93
+ //チェックボックスのPOSTデータ
94
+
37
- if(!empty($this->data["Encode"]["bc_category_id"])){
95
+ if(!empty($post['bc_category_id'])){
38
96
 
39
97
  //JSON形式で保存???
40
98
 
41
- $encode->カラム名 = json_encode($this->data["Encode"]["bc_category_id"], JSON_UNESCAPED_UNICODE);
99
+ $data['カラム名1'] = json_encode($post['bc_category_id'], JSON_UNESCAPED_UNICODE);
42
-
100
+
43
- }
101
+ }
44
-
102
+
45
- //DB保存
103
+ //他のPOSTデータ
46
-
104
+
47
- $this->Encode->save($encode);
105
+ if(!empty($post['other'])){
106
+
107
+ $data['カラム名2'] = $post['other'];
108
+
109
+ }
48
110
 
49
111
  }
50
112
 
113
+
114
+
115
+ //データセットは下記のようにも書けます
116
+
117
+ //$this->Encode->set(array(
118
+
119
+ // 'カラム名' => 'データ',
120
+
121
+ // ...
122
+
123
+ //));
124
+
125
+ //$this->Encode->save();
126
+
127
+
128
+
129
+ //DB保存
130
+
131
+ $this->Encode->save($data);
132
+
51
133
  }
52
134
 
53
135
  ```
136
+
137
+
138
+
139
+ #### CakePHP3
140
+
141
+
142
+
143
+ `$this->request->getData('Encode')`で必要なデータをとれるので下記のように書けます。`$this->request->data()`も引き続き使えますが、CakePHP4で削除予定だそうです。
144
+
145
+ モデルの使い方は、CakePHP2よりも大幅に機能が追加され、書き方もいろいろできるようになってます。
146
+
147
+
148
+
149
+ ```php
150
+
151
+ use Cake\ORM\TableRegistry;
152
+
153
+
154
+
155
+ public function ~~ (){
156
+
157
+ //...
158
+
159
+ //POSTデータ
160
+
161
+ $post = $this->request->getData('Encode');
162
+
163
+ //チェックボックスのPOSTデータ(個別に取り出す)
164
+
165
+ //$categories = $this->request->getData('Encode.bc_category_id');
166
+
167
+
168
+
169
+ $encodeTable = TableRegistry::get('Encode');
170
+
171
+
172
+
173
+ //新規追加
174
+
175
+ $encode = $encodeTable->newEntity();
176
+
177
+ //更新
178
+
179
+ //$encode = $encodeTable->get(プライマリーキーのID値); //DBの特定の行の更新なので
180
+
181
+
182
+
183
+ if ($post) {
184
+
185
+ //チェックボックスのPOSTデータ
186
+
187
+ if(!empty($post['bc_category_id'])){
188
+
189
+ //JSON形式で保存???
190
+
191
+ $encode->カラム名1 = json_encode($post['bc_category_id'], JSON_UNESCAPED_UNICODE);
192
+
193
+ }
194
+
195
+ //他のPOSTデータ
196
+
197
+ if(!empty($post['other'])){
198
+
199
+ $encode->カラム名2 = $post['other'];
200
+
201
+ }
202
+
203
+ }
204
+
205
+
206
+
207
+ //DB保存
208
+
209
+ $encodeTable->save($encode);
210
+
211
+ }
212
+
213
+ ```