質問編集履歴
1
MaterialsController.php add()のソースコードと追加検証結果を追記しました
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
|