无法更新关联的cakephp3中有许多数据

无法更新关联的cakephp3中有许多数据,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,我无法保存(更新)与主模型有许多关系的计算机的模型可用性的关联表单数据。我使用复选框更新了一些“可用性”选项。“不可用”字段。我加了id,但没什么区别。更新后的“汽车可用性”。数据库中未更新“不可用”字段。我没有得到错误,导师的主要模型数据也保存了 我查看了文档和过去的帖子,没有找到这个简单的任务。我做错了什么事 //controller $tutor = $this->Tutors->get($id, [ 'contain' => ['Availabili

我无法保存(更新)与主模型有许多关系的计算机的模型可用性的关联表单数据。我使用复选框更新了一些“可用性”选项。“不可用”字段。我加了id,但没什么区别。更新后的“汽车可用性”。数据库中未更新“不可用”字段。我没有得到错误,导师的主要模型数据也保存了

我查看了文档和过去的帖子,没有找到这个简单的任务。我做错了什么事

//controller
  $tutor = $this->Tutors->get($id, [
        'contain' => ['AvailabilityForTutors']
    ]);
  if ($this->request->is(['patch', 'post', 'put'])) {


         debug($this->request->data);
            $tutor = $this->Tutors->patchEntity($tutor, $this->request->data,['associated' => ['AvailabilityForTutors'],'validate' => false ] );

            if ($this->Tutors->save($tutor)) {
                $this->Flash->success(__('The tutor has been saved.'));
               return $this->redirect(['action' => 'edittest2',$id]);
            } else {
                $this->Flash->error(__('The tutor could not be saved. Please, try again.'));
            }


        }

//view

  <?php

            echo $this->Form->hidden('id', ['value'=>$id]);
            echo $this->Form->input('first_name',['label' => 'Tutor FirstName']);
            echo $this->Form->input('last_name',['label' => 'Tutor LastName']);




            foreach ($tutor->availability_for_tutors as $key => $item) {

               echo $this->Form->hidden('AvailabilityForTutors.'.$key.'.id', ['value'=>$item->id]);

               echo $this->Form->input('AvailabilityForTutors.'.$key.'.not_available', ['label'=>$item->weekday,
                'checked'=> $item->not_available,'type'=>'checkbox']);



           }


model tutor//

 $this->hasMany('AvailabilityForTutors', [
            'foreignKey' => 'tutor_id'
        ]);


posted data which is correct


'id' => '12',
    'first_name' => 'fred',
    'last_name' => 'Tow',
    'AvailabilityForTutors' => [
        (int) 0 => [
            'id' => '36',
            'not_available' => '1'
        ],
        (int) 1 => [
            'id' => '37',
            'not_available' => '0'
        ],
        (int) 2 => [
            'id' => '38',
            'not_available' => '0'
        ],
http://stackoverflow.com/questions/27398100/cakephp-3-0-cant-save-hasmany-associated-data
http://book.cakephp.org/3.0/en/orm/saving-data.html#saving-with-associations

http://stackoverflow.com/questions/35018335/update-a-hasmany-records

//请参阅“不可用”与“修补数据输出”不同

也许这些方法中的一种可以帮助您,我想您需要更换


我用与您相同的方法尝试了它,但失败了,但使用link()它对我有效(对于HABTM)

也许这些方法中的一种会帮助您,我想您需要更换


我用与您相同的方法尝试了它,但失败了,但使用link()它对我有效(对于HABTM)

尝试插入
$tutor->dirty('availability\u for\u tutors',true)控制器内部,在
patchEntity
功能之后。
它会将您的关联标记为“脏”(已修改),以便在调用
$this->Tutors->save
方法时可以保存它。

尝试插入
$tutor->dirty('availability\u for\u Tutors',true)控制器内部,在
patchEntity
功能之后。
         I have 2 solutions
1st

  public function edittest2($id = null)
    {
        $tutor = $this->Tutors->get($id, [
            'contain' => ['AvailabilityForTutors']
        ]);
        if ($this->request->is(['patch', 'post', 'put'])) {


       //  debug($this->request->data);
            $tutor = $this->Tutors->patchEntity($tutor, $this->request->data(),['associated' => ['AvailabilityForTutors']] );
         //    $tutor->dirty('availability_for_tutors', true);

        //  debug($tutor);
             $this->Tutors->save($tutor,[
                        'atomic'=>false,
                        'validate' => false,
                        'associated' => ['AvailabilityForTutors']
                    ]); 


             return $this->redirect(['action' => 'edittest2',$id]);
        }



 view

 foreach ($tutor->availability_for_tutors as $key => $item) {

               echo $this->Form->hidden('availability_for_tutors.'.$key.'.id', ['value'=>$item->id]);

                echo $this->Form->input('availability_for_tutors.'.$key.'.not_available', ['label'=>$item->weekday,
                    'checked'=> $item->not_available,'type'=>'checkbox']);


           }


      2nd 
         public function edittest4($id = null)
            $tutor = $this->Tutors->get($id, [
                'contain' => ['AvailabilityForTutors']
            ]);


            $availability=$tutor['availability_for_tutors'];


            if ($this->request->is(['patch', 'post', 'put'])) {


                $tutor = $this->Tutors->patchEntity($tutor, $this->request->data(),['validate' => false ] );

                 $this->Tutors->save($tutor); 

                 $newavailability = $this->Tutors->AvailabilityForTutors->patchEntities(  $availability,$tutor->AvailabilityForTutors, ['validate' =>  false]); //multiple entities
                foreach ($newavailability as $key => $item) {
                   $result=$this->Tutors->AvailabilityForTutors->save($item, ['checkExisting' => false]);

                    if ( $result ){
                       $this->Flash->success(__('A lesson has been saved on .'));

                    }
                    else{
                      $this->Flash->error(__('There has been an error saving a lesson. Please, try again.'));
                    }//if

                 }//for each



                 return $this->redirect(['action' => 'edittest4',$id]);
            }


    view
    ///
     foreach ($availability as $key => $item) {
                 //  debug($item->toArray());
                echo $this->Form->hidden('AvailabilityForTutors.'.$key.'.id', ['value'=>$item->id]);

                      echo $this->Form->input('AvailabilityForTutors.'.$key.'.not_available', ['label'=>$item->weekday,
                        'checked'=> $item->not_available,'type'=>'checkbox']);


               } 

它会将您的关联标记为“脏”(已修改),以便在调用
$this->Tutors->save
方法时可以保存该关联。

您好,很抱歉,我插入了$tutor->dirty('availability\u for\u Tutors',true);就像你说的,什么都没有?关联模型上没有错误,也没有保存。这不应该这么复杂,但它是isHi,当我插入$tutor->dirty('availability\u for\u tutors',true)时,这不起作用;就像你说的,什么都没有?关联模型上没有错误,也没有保存。这不应该是这么复杂,但它是我不想要这个HABTM,因为我需要一个1到多,因为我有。我无法理解你的解决方案是什么对不起,因为我需要一个我想说的例子。我不想要这个HABTM,因为我需要一个1对多的。我无法理解您的解决方案是什么,很抱歉,因为我需要一个示例。您的实体在修补后会立即出现吗?保存这些可用性记录的表的名称和模式是什么?36、37和38是导师的id吗?调试中的补丁数据具有旧的可用性,然后此表再次出现,新值带有id正确字段(请参阅OP中的更新)。我真的需要这样做,我可以请一个例子。我发现很多人都有这个问题,我也试着用$this->Tutors->save($tutor,['atomic'=>false,'validate'=>false,'associated'=>['AvailabilityForTutors']它没有保存关联的数据在您的修补实体中有两个名称不同的数组,这就是它没有保存的原因。请注意,读取的数据上的实体名称是AvailabilityForTutor(单数).您的新数据有一个复数键。请尝试在表单中使用单数形式?此外,您只回答了我的三个问题中的一个…是的,如果视图中的小写字母适用于家庭教师,则有效。现在我有两个解决方案。您想到了第一个。我提出了两个解决方案。您的实体在修补后外观如何?名称和模式是什么这些可用性记录应该保存在哪个表中?36、37和38是导师的id吗?来自调试的修补数据具有旧的AvailabilityForTutors值,然后该表再次显示,带有id正确字段的新值(参见OP中的更新)。我真的需要这样做。我能举个例子吗?我看到很多人在这方面有问题。我也尝试过用$this->Tutors->save($tutor,['atomic'=>false,'validate'=>false,'associated'=>['AvailabilityForTutors']它没有保存关联的数据在您的修补实体中有两个名称不同的数组,这就是它没有保存的原因。请注意,读取的数据上的实体名称是AvailabilityForTutor(单数).您的新数据有一个复数键。请尝试在表单中使用单数?此外,您只回答了我的三个问题中的一个…是的,如果视图中的小写字母可供导师使用,则有效。现在我有两个解决方案。您想到了第一个。我提出了两个解决方案
         I have 2 solutions
1st

  public function edittest2($id = null)
    {
        $tutor = $this->Tutors->get($id, [
            'contain' => ['AvailabilityForTutors']
        ]);
        if ($this->request->is(['patch', 'post', 'put'])) {


       //  debug($this->request->data);
            $tutor = $this->Tutors->patchEntity($tutor, $this->request->data(),['associated' => ['AvailabilityForTutors']] );
         //    $tutor->dirty('availability_for_tutors', true);

        //  debug($tutor);
             $this->Tutors->save($tutor,[
                        'atomic'=>false,
                        'validate' => false,
                        'associated' => ['AvailabilityForTutors']
                    ]); 


             return $this->redirect(['action' => 'edittest2',$id]);
        }



 view

 foreach ($tutor->availability_for_tutors as $key => $item) {

               echo $this->Form->hidden('availability_for_tutors.'.$key.'.id', ['value'=>$item->id]);

                echo $this->Form->input('availability_for_tutors.'.$key.'.not_available', ['label'=>$item->weekday,
                    'checked'=> $item->not_available,'type'=>'checkbox']);


           }


      2nd 
         public function edittest4($id = null)
            $tutor = $this->Tutors->get($id, [
                'contain' => ['AvailabilityForTutors']
            ]);


            $availability=$tutor['availability_for_tutors'];


            if ($this->request->is(['patch', 'post', 'put'])) {


                $tutor = $this->Tutors->patchEntity($tutor, $this->request->data(),['validate' => false ] );

                 $this->Tutors->save($tutor); 

                 $newavailability = $this->Tutors->AvailabilityForTutors->patchEntities(  $availability,$tutor->AvailabilityForTutors, ['validate' =>  false]); //multiple entities
                foreach ($newavailability as $key => $item) {
                   $result=$this->Tutors->AvailabilityForTutors->save($item, ['checkExisting' => false]);

                    if ( $result ){
                       $this->Flash->success(__('A lesson has been saved on .'));

                    }
                    else{
                      $this->Flash->error(__('There has been an error saving a lesson. Please, try again.'));
                    }//if

                 }//for each



                 return $this->redirect(['action' => 'edittest4',$id]);
            }


    view
    ///
     foreach ($availability as $key => $item) {
                 //  debug($item->toArray());
                echo $this->Form->hidden('AvailabilityForTutors.'.$key.'.id', ['value'=>$item->id]);

                      echo $this->Form->input('AvailabilityForTutors.'.$key.'.not_available', ['label'=>$item->weekday,
                        'checked'=> $item->not_available,'type'=>'checkbox']);


               }