2017-03-08 1 views
0

나는 다음과 같은 테이블이 있습니다CakePHP의 3 - 관련 테이블의 데이터의 조건 절약

  • 예약 (hasOne의 세션)
  • 세션 (hasOne의 고객 직원)
  • 고객 직원

을 내 양식에는 다음과 같이 지정된 입력 필드가 있습니다.

  • 예약 관련 필드의 경우 양식 입력 ID는 name입니다.
  • 세션 관련 입력란의 양식 입력 ID는 session.name의 형식입니다.
  • 게스트 스태프 관련 필드의 경우 양식 입력 ID의 형식은 session.gueststaff.name입니다.

그러나 모든 세션에 게스트 스탭이있는 것은 아니므로 필드에 입력 한 경우에만 newEntity를 만들고 제출할 때 게스트 스탭에게 데이터를 저장하려고합니다. 현재 게스트와 함께 제출을 시도하면 직원 입력이 채워지면 저장이 잘됩니다. 그러나 게스트 스탭 입력이 채워지지 않고 양식을 제출하려고하면 저장이 실패합니다.

컨트롤러에서 $ save 디버그를하면 다음과 같이 나타납니다. false 이것은별로 도움이되지 않습니다. 그때 그때 다시 케이크 구워을 MySQL의에서 NOT NULL 요구 사항을 제거하려고 시도

Guest Staff { 
    firstname: 
    lastname:  
} 

: POST 데이터를 통해 찾고

, 게스트 직원 배열이의 형태 (기본적으로 비어 있음)에 게스트 스탭 모델 그러나 양식을 저장할 수있는 동안이 양식을 다시 제출하려고 시도했을 때 ID와 외래 키를 세션에 연결 한 상태로 Guest 스태프 테이블에 새로운 데이터 항목이 만들어졌지만 필드가 공백이었습니다. 이는 내가 원했던 것이 아닙니다. 그 테이블에 많은 쓸모없는 데이터 항목이 있다는 뜻입니다.

업데이트 : 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를 사용하여 편집하고 추가 할 수있다. 그런 다음 엔터티를 해제 할 수있다. empty (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'의 생성을 넣었을 때, 뷰 자체에'$ booking'은 정의되어 있지 않다고되어 있습니다. 내보기에서,'$ this-> Form-> create ($ booking)'은 폼을 시작하는 것으로서, $ booking은 POST 이전에 newEntity를 생성 한 것을 가리킨다. POST 후에'newEntity' 생성이 이동되었으므로 $ booking을 어떻게 참조해야합니까? – mistaq

+0

질문을 양식과 저장 방법으로 업데이트하면 더 명확 해집니다. –

+0

OP에 추가되었습니다. – mistaq