2016-07-11 14 views
1

Ich kann verknüpfte Formulardaten für Modell AvailabilityForTutors nicht speichern (aktualisieren), die eine hasMany Beziehung mit dem primären Modell hat. Ich habe Checkboxen verwendet, um einige Optionen für die 'AvailabilityForTutors' zu aktualisieren. Nicht verfügbares Feld Ich fügte IDs hinzu, aber das machte keinen Unterschied. Der aktualisierte 'AvailabilityForTutors'. not_available 'Feld wird nicht in der Datenbank aktualisiert. Ich erhalte keinen Fehler und die primären Modelldaten für den Tutor werden gespeichert.cant aktualisieren verknüpfte hasMany Daten in CakePHP3

Ich habe die Dokumente und früheren Beiträge für diese einfache Aufgabe überprüft und ich kann es nicht bekommen. Ich mache etwas falsch.

//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 

UPDATE- debug gepatchten Daten Objekt (App \ Modell \ Entity \ Tutor) {

'id' => (int) 12, 
'tutor_inactive' => false, 
'first_name' => 'fred2', 
'last_name' => 'Tow2', 

'availability_for_tutors' => [ 
    (int) 0 => object(App\Model\Entity\AvailabilityForTutor) { 

     'id' => (int) 36, 
     'not_available' => false, 
     .... 
], 
'AvailabilityForTutors' => [ 
    (int) 0 => [ 
     'id' => '36', 
     'not_available' => '1' 

// not_available sehen ist, unterscheidet sich von patched Datenausgang

+0

Sieht Ihre Entität direkt nach dem Patchen aus? Wie lautet der Name und das Schema der Tabelle, in der diese Verfügbarkeitsdatensätze gespeichert werden sollen? Sind 36, 37 und 38 die IDs von Tutoren? –

+0

Die gepatchten Daten aus dem Debug haben die alten AvailabilityForTutors-Werte und dann erscheint diese Tabelle erneut mit den neuen Werten mit dem ID-korrekten Feld (siehe Update in OP). Ich brauche das wirklich, kann ich bitte ein Beispiel bekommen. Ich sehe eine Menge Leute haben Probleme mit dieser – ajt

+0

Ich habe auch versucht, mit $ this-> Tutoren-> speichern ($ Tutor, [ 'atomic' => false, 'validate' => false, 'associated' = > ['AvailabilityForTutors'] Die zugehörigen Daten wurden nicht gespeichert – ajt

Antwort

0

vielleicht eine dieser Methoden wird Ihnen helfen, ich denke, Sie brauchen ersetzen http://api.cakephp.org/3.2/class-Cake.ORM.Association.HasMany.html

Ich versuchte es auf die gleiche Weise wie Sie und scheiterte aber mit Link() es funktionierte für mich (für HABTM)

+0

gestellt Ich will diese HABTM nicht, da ich eine 1 zu viele benötige, wie ich sie habe bei Ihrer Lösung war es leid, ich brauche ein Beispiel, würde ich sagen. – ajt

0

Versuchen Sie $tutor->dirty('availability_for_tutors', true); in den Controller nach der patchEntity Funktion einzufügen. Es wird Ihre Zuordnung als "schmutzig" (geändert) markieren, so dass es gespeichert werden kann, wenn $this->Tutors->save Methode aufgerufen wird.

+0

Hallo, Das hat nicht geklappt, sorry, da ich $ tutor-> dirty eingefügt habe ('availability_for_tutors', true); wie du gesagt hast und nichts? Kein Fehler und keine Speicherung des zugehörigen Modells. Das sollte nicht so kompliziert sein, aber es ist so – ajt

0
  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']); 


       }