2016-05-20 15 views
0

Ich habe ein Problem beim Speichern von Daten mit hasMany Zuordnung. Es gibt zwei Tabellen wie Balg. Wenn ich es jetzt speichere, speichert es nur die Daten services table, speichert es aber nicht in der Tabelle service_times. Auch ich habe hier Vorlage und Controller-Code angegeben. Kann mir jemand vorschlagen, wie kann ich dieses Problem lösen.So speichern Sie HasMany Associations Daten in CakePHP 3.x

1) services table: 
id | id | ... 
1 | name | ... 

2) service_times table 
id | id | ... 
1 | service_id | ... 
2 | star_time | (type= time) 
3 | end_time | (type= time) 

Schablonenform:

<?= $this->Form->create($service) ?> 
    <fieldset> 
     <legend><?= __('Add Service') ?></legend> 
     <?php 
      echo $this->Form->input('name'); 
      echo $this->Form->input('ServiceTimes.start_time'); 
      echo $this->Form->input('ServiceTimes.end_time'); 
      echo $this->Form->input('description'); 
     ?> 
    </fieldset> 
    <?= $this->Form->button(__('Submit')) ?> 
    <?= $this->Form->end() ?> 

Service Controller

public function add(){ 
     $service = $this->Services->newEntity($this->request->data, [ 
       'associated' => ['ServiceTimes'] 
      ]); 

      if ($this->request->is('post')) { 
       if ($this->Services->save($service, ['associated' => ['ServiceTimes']])) { 
        pr($this->request->data);exit; 
        $this->Flash->success(__('The service has been saved.')); 
        return $this->redirect(['action' => 'index']); 
       } else { 
        $this->Flash->error(__('The service could not be saved. Please, try again.')); 
       } 
      } 
     //} 

     $this->set(compact('service')); 
     $this->set('_serialize', ['service']); 
     $this->viewBuilder()->theme('ThemeAdmin'); 
    } 
+0

Ich würde vorschlagen, einen Blick auf die Dokumente, die zu Machen Sie sich klar, wie die zugehörigen Daten strukturiert sein müssen, um richtig gespeichert zu werden. ** http: //book.cakephp.org/3.0/en/views/helpers/form.html#creating-inputs-for-associated-data** | ** http: //book.cakephp.org/3.0/en/orm/saving-data.html#saving-hasmany-associations** – ndm

Antwort

0

ich, dass eine intelligente Lösung denke wäre eine andere Einheit für service_times Tabelle zu erstellen und Fügen Sie ein kleines Formular für diesen Tisch in th Hier speichern Sie nur diese beiden Attribute. Das sollte den "sicheren" Teil des Problems lösen.

+2

Das klingt eher nach einem Workaround, um nicht zu verstehen, wie das Speichern von Assoziationen funktioniert ... Ich empfehle das zu tun. – ndm

0

Endlich habe ich es lösen durch folgende:

meine CTP-Datei wie

<?= $this->Form->create($service) ?> 
    <fieldset> 
     <legend><?= __('Add Service') ?></legend> 
     <?php 
      echo $this->Form->input('name'); 
      echo $this->Form->input('serviceTimes.start_time'); 
      echo $this->Form->input('serviceTimes.end_time'); 
      echo $this->Form->input('description'); 
     ?> 
    </fieldset> 
    <?= $this->Form->button(__('Submit')) ?> 
    <?= $this->Form->end() ?> 

Reglerfunktion

public function add() 
    { 
     $service = $this->Services->newEntity(); 
     if ($this->request->is('post')) { 
      $service = $this->Services->patchEntity($service, $this->request->data); 
      if ($this->Services->save($service)) { 
       // Last inserted service id 
       $service_id = $service->id; 
       $serviceTime = $this->Services->ServiceTimes->newEntity(); 
       $serviceTime->service_id = $service_id; 
       $serviceTime->start_time = $this->request->data['serviceTimes']['start_time']; 
       $serviceTime->end_time = $this->request->data['serviceTimes']['end_time']; 
       if ($this->Services->ServiceTimes->save($serviceTime)) { 
        $this->Flash->success(__('The service has been saved.')); 
        return $this->redirect(['action' => 'index']); 
       } 
      } else { 
       $this->Flash->error(__('The service could not be saved. Please, try again.')); 
      } 
     } 

     $this->set(compact('service')); 
     $this->set('_serialize', ['service']); 
     $this->viewBuilder()->theme('ThemeAdmin'); 
    }