2016-09-23 7 views
1

関連するレコードをcakephp3に保存することはできますが、コードを見ると1回の保存呼び出しですべてのレコードが一度に保存されることはありません。 すべてのレコードを一度に保存しようとすると問題が発生しました。 GuardianとUsersテーブルがどのように処理されているかを見ると、個別に保存されます。 コードは動作し、レコードを保存しますが、ガーディアンテーブルでエラーが発生したため、1回の保存呼び出しですべてを一度に保存することは問題でした。関連するすべてのレコードを一度に保存

Guardians have a 1 to many relationship with students 
Students and Users have a 1 to 1 
Students to subjects and availabilityFotStudents both have a many to many 

コード

public function add($gId=0) { 
     $this->loadModel("Guardians"); 
     $this->loadModel('PaymentTypes'); 
     $this->set("title","Add Student"); 
     $guardians=null; 


     if ($gId>0){ 
      $guardians =$this->Guardians->get($gId); 
     } 

     if ($this->request->is('post')) { 

      if ($this->request->data['studenttype']==0){ //enquiry 
       $this->request->data['students']['address_billing'] = 0; 
       $this->request->data['students']['student_enq'] = 1; 
      } 
      else if ($this->request->data['studenttype']==1){ //waitlist 
       $this->request->data['students']['address_billing'] = 1; 
       $this->request->data['students']['student_enq'] = 0; 
      } 
      else if ($this->request->data['studenttype']==2){ //skip waitlist 
       $this->request->data['students']['address_billing'] = 4; 
       $this->request->data['students']['student_enq'] = 0; 
      }    

      if ($this->request->data['students']['tutoring_typest_id']==1){ 
       $this->request->data['students']['group_status']=0; 
      } 
      else if ($this->request->data['students']['tutoring_typest_id']>1){ 
       $this->request->data['students']['group_status']=1; 
      } 

      if ($this->request->data['students']['tutoring_typest_id']==3){//group only 
       $this->request->data['students']['address_billing'] = 4; 
      } 

      $data = $this->request->data; 
      // debug($data); 



       $uname= $this->request->data['Users']['username']; 
       if ($this->Students->Users->findByUsername($uname)->count()) { 
       $this->Flash->error(__('Username exists. Please, try again.')); 
       return $this->redirect(["action"=>"add",$gId]); 
       } 
       $userId=0; 

       $entity = $this->Students->Users->newEntity($this->request->data['Users'],['validate'=>false]); 
       $entity->role = "student"; 
      $entity['role_id'] = 4; 
       $entity = $this->Students->Users->save($entity); 

      // debug($entity); 
       $studentUserId = $entity->id; 


      if($guardians==null) { 
       $guardians = $this->Guardians->newEntity($this->request->data['guardians'], ['validate' => false]); 
      } 

      $guardianEntity = $this->Guardians->save($guardians); 
      $guardians = $this->Students->newEntity(); 
      $studentData = $this->request->data['students']; 
      $studentData['subjects'] = $this->request->data['subjects']; 
      $studentData['availability_for_students'] = $this->request->data['availability_for_students']; 
      $studentEntity = $this->Students->patchEntity($guardians,$studentData, 
       [ 
        "validate"=>false, 
        'associated' => [ 
         "AvailabilityForStudents"=>["validate"=>false], 
         "Subjects"=>["validate"=>false] 
        ] 

       ] 
      ); 
      $studentEntity->guardian_id = $guardianEntity->id; 
      $studentEntity->user_id = $studentUserId; 

      $studentEntity = $this->Students->save($studentEntity, 
       [ 
        "validate"=>false, 
        'associated' => [ 
         "AvailabilityForStudents"=>["validate"=>false], 
         "Subjects"=>["validate"=>false] 
        ] 

       ] 
      ); 
      if ($studentEntity) { 
       $this->Flash->success(__('The student has been saved')); 
       return $this->redirect(["action"=>"index2"]); 
      } else { 
       $this->Flash->error(__('The student could not be saved. Please, try again.'),'flash_alert'); 
      } 

     }//post 
     $subjects = $this->Students->Subjects->find('list', array('order' => array('Subjects.name' => 'asc'))); 
     $weekdays = $this->Students->weekDays; 
     $tutoringTypes = $this->Students->TutoringTypeStudents->find('list'); 


     //$payments = $this->Student->paymentOptions; 
     $this->PaymentTypes->primaryKey("name"); 
     $payments = $this->PaymentTypes->find('list', array(
      'fields'  => array('PaymentTypes.name','PaymentTypes.name')) ); 
     $referrals = $this->Students->Referrals->find('list'); 
     $tutorGender = $this->Students->Lessons->Tutors->tutorGender; 

     $this->set('guardians', $guardians); 
     $this->set(compact('referrals','subjects', 'tutoringTypes', 'weekdays','payments','tutorGender')); 

    } 
+0

誰もがアイデアを持っている場合、私はまだこれを動作させることができません? – ajt

答えて

3

あなたはTranactionalデータを保存することができます。複数の保存方法を実行できる場所。保存メソッドが失敗した場合、保存されるデータはありません。それはあなたが言及した "1セーブコール"のように機能します

関連する問題