私は、次の表があります。CakePHPの3 - 関連付けられたテーブル内のデータの条件付き省
- 予約(hasOneのセッション)
- セッション(hasOneのユーザーレビュースタッフ)
- ユーザーレビュースタッフ
を私のフォームでは、次のように入力フィールドを指定しています:
- 予約関連フィールドの場合、フォーム入力のIDは
name
の形式です。 - セッション関連のフィールドの場合、フォーム入力のIDは
session.name
の形式です。 - ゲストスタッフ関連のフィールドの場合、フォーム入力IDは
session.gueststaff.name
の形式です。
しかし、すべてのセッションにゲストスタッフがいるわけではないので、フィールドの入力が完了した場合にのみnewEntityを作成してゲストスタッフにデータを保存します。現在、Guestスタッフの入力が記入され、保存は正常に機能します。しかし、Guest Staffの入力が一杯になることなくフォームを送信しようとすると、保存に失敗します。
コントローラーで$ saveのデバッグをしてくれました:false
これはあまり役に立ちません。
POSTデータを通して見ると、ユーザーレビュースタッフの配列は、この形(基本的には空)である:
Guest Staff {
firstname:
lastname:
}
私は、その後のMySQLでNOT NULL要件を削除しようとしましたが、その後、再ケーキ焼きますゲストスタッフモデルしかし、フォームを保存することができた後にこのフォームを再送信しようとすると、IDと外部キーがセッションに接続された新しいスタッフがGuest Staffテーブルに作成されましたが、フィールドは空白で、これは私が望むものではありません。それは、そのテーブルに無駄なデータエントリがたくさんあることを意味します。
更新: Manohar Khadkaの提案によれば、if文を追加して設定を解除しました。コントローラ内の現在
:
public function add()
{
if ($this->request->is('post')) {
$data = $this->request->data;
if(empty($data['session']['gueststaff']['firstname'])){
unset($data['session']['gueststaff']);
$booking = $this->Bookings->newEntity([
'associated' => [
'Sessions'
]
]);
} else {
$booking = $this->Bookings->newEntity([
'associated' => [
'Sessions', 'Sessions.Gueststaff'
]
]);
}
$booking = $this->Bookings->patchEntity($booking, $data, [
'associated' => [
'Sessions', 'Sessions.Gueststaff'
]
]);
$save = $this->Bookings->save($booking);
if ($save) {
$this->Flash->success(__('The booking was successfully completed.'));
return $this->redirect(['controller' => 'bookings', 'action' => 'index']);
} else {
$this->Flash->error(__('Unfortunately, the booking could not be completed. Please try again.'));
}
}
}
そして、私形式:
<?= $this->Form->create($booking) ?>
<legend><?= __('Session Details') ?></legend>
<?= $this->Form->input('session.location', ['class' => 'form-control']); ?>
<?= $this->Form->input('session.date', ['class' => 'form-control']); ?>
<h6>Warning: Fill in the following Guest Staff details if a Guest Staff member will be present.</h6>
<?= $this->Form->input('session.gueststaff.firstname', ['class' => 'form-control']); ?>
<?= $this->Form->input('session.gueststaff.lastname', ['class' => 'form-control']); ?>
<?= $this->Form->button('<strong>' . __('Complete Session Details') . '</strong>', ['id' => 'submit', 'class' => 'btn btn-primary']); ?>
<?= $this->Form->end() ?>
別のフォームにオプションのデータを追加することを選択しましたが、$ this-> request-> dataを使用してそれらをチェックしてメソッドを追加するとエンティティを設定解除することができます空(patchEntityの前)。 –