我有以下表格:CakePHP的3 - 在关联表数据的条件保存
- 预订(hasOne会话)
- 会议(hasOne游客职员)
- 游客的工作人员
在我的表格中,我有如下输入字段:
- 对于预订相关字段,其表单输入的ID为
name
。 - 对于会话相关字段,其表单输入的ID格式为
session.name
。 - 对于来宾人员相关的领域,他们的表单输入ID的形式是
session.gueststaff.name
。
然而,并非所有会话都有游客的工作人员,所以我只想创造一个newEntity和数据保存到游客的工作人员只有在各自的领域都填写提交。目前,当我试图与客户提交工作人员输入填写,保存工作正常。但是,当我尝试表单提交而没有任何客人服务人员的输入时,保存失败。
控制器中的$ save调试给了我这个:false
,这不是很有帮助。
通过POST数据来看,来宾职员阵列处于这种形式(基本上是空的):
Guest Staff {
firstname:
lastname:
}
我然后试图除去在MySQL中不为空的要求,然后再重新蛋糕烘宾客人员模型。然而,当我在这之后尝试重新提交表单时,表单可以保存时,仍然在Guest Staff表中创建了一个新的数据条目,只有一个ID和连接到Sessions的外键,而另一个字段是空白的,这不是我想要的,因为这意味着该表中会有大量无用的数据条目。
更新:根据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之前)。 –