teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

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

2019/09/10 17:06

投稿

gunung
gunung

スコア4

title CHANGED
File without changes
body CHANGED
@@ -48,6 +48,57 @@
48
48
  'joinType' => 'LEFT'
49
49
  ]);
50
50
  ```
51
+
52
+ 質問の投稿以降に行った検証で気づいた点があります。
53
+ 追加画面で貸出なし(empty)を選択しても、
54
+ MaterialsController.phpのadd()で
55
+ $material('user_id') =0;
56
+ と強制的に値を代入すれば、追加は成功するということです。
57
+
58
+ ソースコードは下記のとおりです。
59
+ ```PHP
60
+ public function add()
61
+ {
62
+ $material = $this->Materials->newEntity();
63
+ if ($this->request->is('post')) {
64
+ $material = $this->Materials->patchEntity($material, $this->request->getData());
65
+ $material['status'] = '';
66
+ $material['creator'] = $this->Auth->user('id');
67
+ $material['user_id'] = 0; //この行が追加した部分です。
68
+ if ($this->Materials->save($material)) {
69
+ $this->Flash->success(__('資料情報は保存されました。'));
70
+
71
+ return $this->redirect(['action' => 'index']);
72
+ }
73
+ $this->Flash->error(__('資料情報は保存されませんでした。もう一度お試しください。'));
74
+ }
75
+ $users = $this->Materials->Users->find('list', ['limit' => 200]);
76
+ $this->set(compact('material', 'users'));
77
+ }
78
+ ```
79
+
80
+ この結果から推測してみました。
81
+ 貸出先でEmpty以外のユーザーが選ばれている場合、
82
+ $this->request->getData() にはuser_idが含まれた状態になります。
83
+ その値はpatchEntityによって、$material['user_id']に一括代入されるので、
84
+ 無理に代入しなくても、正常にレコードの追加が実行されます。
85
+
86
+ しかし、貸出先でEmpty(貸出なし)を選択した場合、
87
+ $this->request->getData()にuser_idの項目が存在しなくなるのではないかと思います。
88
+ その場合、patchEntityも$material['user_id']に代入は行わず、
89
+ レコードの追加実行時に
90
+ 「Field 'user_id' doesn't have a default value 」というエラーを出力するに至るのではないかと思うのです。
91
+
92
+ それで、前出のコードのようにpatchEntityの実施後、
93
+ $material['user_id'] = 0;
94
+ のように強制的に値を代入してやれば、レコードの追加実行時にもエラーにならずに済むということになります。
95
+
96
+ ということは$this->request->getData()に
97
+ user_id の値が含まれているかいないかを判定して、
98
+ 含まれていない時のみ、貸出されていないことを示す 0 を強制的に代入すればいいはずです。
99
+
100
+ でも、その判定式の書き方が分かりません。
101
+
51
102
  ### 補足情報(FW/ツールのバージョンなど)
52
103
  PHP 7.2.4
53
104
  CakePHP 3.8.2