一次保存所有相关记录


save all associated records at once

我能够在cakephp3中保存相关记录,但如果您查看代码,记录不会一次性保存为1保存调用。我在一次保存所有记录时确实遇到了问题。如果你看一下它是如何做到的,你会发现Guardian和Users表是分开保存的。代码工作并保存记录,但在一次保存调用中保存所有记录是一个问题,因为我在监护人表上得到了一个错误。

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'));
    }

可以使用transaction数据保存。其中可以运行多个保存方法。如果任何保存方法失败,则不会保存任何数据。就像你刚才提到的"1 save call"一样