2017-03-08 60 views
0

我有以下表格: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() ?> 
+1

我尝试了相同的外观,并选择在其他表单上添加可选数据,但是您可以在编辑和添加方法时使用$ this-> request-> data检查它们,然后如果它是空(在patchEntity之前)。 –

回答

1

可能是你可以更好地处理这些事情形成Callbacks方法类似beforeSave。

或者你可以简单地检查是否字段为空在节约的方法,如:

public function add() 
{ 
    $booking = $this->Bookings->newEntity(); 
    if ($this->request->is('post')) { 
     $data = $this->request->data; 
     if(empty($data['session']['gueststaff']['firstname'])){ 
      unset($data['session']['gueststaff']); 
      $booking = $this->Bookings->patchEntity($booking, $data, [ 
       'associated' => [ 
        'Sessions' 
       ] 
      ]); 
     } else { 
      $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->set(compact('booking')); 
    } 
} 

上面的逻辑使得当我想输入的字段名称如下:

<?= $this->Form->input('gueststaff.fname');?> //<input type="text" name="gueststaff[fname]"> 
<?= $this->Form->input('gueststaff.lname');?> 

,你可以做这些如果你愿意的话,客户端的东西。

+0

当我在'$ this-> request->'('post')'之后创建'newEntity'时,在View本身上它说'$ booking'是未定义的。在我的View中,'$ this-> Form-> create($ booking)'是什么开始的形式,其中$ booking指的是在POST之前创建'newEntity'的过程。自从'newEntity'创建在POST后移动后,我应该如何参考$ booking? – mistaq

+0

好吧,如果你用你的表格和保存方法更新你的问题,这将会更加清晰。 –

+0

将其添加到OP。 – mistaq