2017-03-08 65 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