2016-09-23 40 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”