質問編集履歴

1

MaterialsController.php add()のソースコードと追加検証結果を追記しました

2019/09/10 17:06

投稿

gunung
gunung

スコア4

test CHANGED
File without changes
test CHANGED
@@ -98,6 +98,108 @@
98
98
 
99
99
  ```
100
100
 
101
+
102
+
103
+ 質問の投稿以降に行った検証で気づいた点があります。
104
+
105
+ 追加画面で貸出なし(empty)を選択しても、
106
+
107
+ MaterialsController.phpのadd()で
108
+
109
+ $material('user_id') =0;
110
+
111
+ と強制的に値を代入すれば、追加は成功するということです。
112
+
113
+
114
+
115
+ ソースコードは下記のとおりです。
116
+
117
+ ```PHP
118
+
119
+ public function add()
120
+
121
+ {
122
+
123
+ $material = $this->Materials->newEntity();
124
+
125
+ if ($this->request->is('post')) {
126
+
127
+ $material = $this->Materials->patchEntity($material, $this->request->getData());
128
+
129
+ $material['status'] = '';
130
+
131
+ $material['creator'] = $this->Auth->user('id');
132
+
133
+ $material['user_id'] = 0; //この行が追加した部分です。
134
+
135
+ if ($this->Materials->save($material)) {
136
+
137
+ $this->Flash->success(__('資料情報は保存されました。'));
138
+
139
+
140
+
141
+ return $this->redirect(['action' => 'index']);
142
+
143
+ }
144
+
145
+ $this->Flash->error(__('資料情報は保存されませんでした。もう一度お試しください。'));
146
+
147
+ }
148
+
149
+ $users = $this->Materials->Users->find('list', ['limit' => 200]);
150
+
151
+ $this->set(compact('material', 'users'));
152
+
153
+ }
154
+
155
+ ```
156
+
157
+
158
+
159
+ この結果から推測してみました。
160
+
161
+ 貸出先でEmpty以外のユーザーが選ばれている場合、
162
+
163
+ $this->request->getData() にはuser_idが含まれた状態になります。
164
+
165
+ その値はpatchEntityによって、$material['user_id']に一括代入されるので、
166
+
167
+ 無理に代入しなくても、正常にレコードの追加が実行されます。
168
+
169
+
170
+
171
+ しかし、貸出先でEmpty(貸出なし)を選択した場合、
172
+
173
+ $this->request->getData()にuser_idの項目が存在しなくなるのではないかと思います。
174
+
175
+ その場合、patchEntityも$material['user_id']に代入は行わず、
176
+
177
+ レコードの追加実行時に
178
+
179
+ 「Field 'user_id' doesn't have a default value 」というエラーを出力するに至るのではないかと思うのです。
180
+
181
+
182
+
183
+ それで、前出のコードのようにpatchEntityの実施後、
184
+
185
+ $material['user_id'] = 0;
186
+
187
+ のように強制的に値を代入してやれば、レコードの追加実行時にもエラーにならずに済むということになります。
188
+
189
+
190
+
191
+ ということは$this->request->getData()に
192
+
193
+ user_id の値が含まれているかいないかを判定して、
194
+
195
+ 含まれていない時のみ、貸出されていないことを示す 0 を強制的に代入すればいいはずです。
196
+
197
+
198
+
199
+ でも、その判定式の書き方が分かりません。
200
+
201
+
202
+
101
203
  ### 補足情報(FW/ツールのバージョンなど)
102
204
 
103
205
  PHP 7.2.4