一次保存所有相关记录

时间:2016-09-23 23:57:33

标签: php cakephp

我可以在cakephp3中保存相关记录,但是如果查看代码,则一次保存调用不会同时保存所有记录。 我试图一次性保存所有记录时遇到问题。如果你看看它是如何完成的,你会看到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'));

    }

1 个答案:

答案 0 :(得分:3)

您可以使用Tranactional数据保存。你可以在哪里运行多个保存方法。如果任何保存方法失败,则不会保存任何数据。所以它就像你提到的“1保存电话”