2017-03-08 26 views
0

私は、次の表があります。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() ?> 
+1

別のフォームにオプションのデータを追加することを選択しましたが、$ this-> request-> dataを使用してそれらをチェックしてメソッドを追加するとエンティティを設定解除することができます空(patchEntityの前)。 –

答えて

1

は、あなたがより良いこれらの事を扱うことができてもよいbeforeSaveのようなCallbacks方法を形成します。

またはフィールドのような方法を保存で空になっている場合は、単純にチェックすることができます。

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-> is( 'post')'の後に 'newEntity'を作成すると、View自体に' $ booking'は定義されていません。私の見解では、 '$ this-> Form-> create($ booking)'はフォームを開始するもので、$ bookingはPOSTの前に 'newEntity'の作成を参照しています。 POSTの後に 'newEntity'の作成が移動されたので、$ bookingをどのように参照すればいいですか? – mistaq

+0

あなたのフォームと保存方法であなたの質問を更新すればもっと明白になるでしょう。 –

+0

OPに追加しました。 – mistaq

関連する問題