2016-09-23 28 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 save call」

相關問題