2016-06-28 8 views
1

Speichern Ich habe Funktion in der Steuerung bekommt, das wie folgt aussieht:CakePHP 3 - Daten Verein vor

//Create room 
public function createRoom(){ 
    $room = $this->Rooms->newEntity(); 
    if($this->request->is('post')){ 
     $room = $this->Rooms->patchEntity($room, $this->request->data); 
     $user_field = $this->Rooms->Users->find()->where(['id' => $this->Auth->user('id')]); 
     $room->users = [$user_field]; 
     $room->current = 1; 
     $room->owner_id = $this->Auth->user('id'); 
     Log::debug($room); 
     if($this->Rooms->save($room)){ 
      $this->Flash->success('You have created a new room.'); 
      return $this->redirect(['action' => 'index']); 
     } 
     else{ 
      $this->Flash->error('Error creating new room.'); 
     } 
    } 
    $games = $this->Rooms->Games->find('list', ['limit' => 200, 'keyField' => 'id', 'valueField' => 'name']); 
    $this->set(compact('room', 'games', 'users')); 
    $this->set('_serialize', ['room']); 
} 

Tabellen „Benutzer“ und „Zimmer“ ist in Zuordnungstabelle verbunden. Wenn ich einen neuen Raum hinzufüge und den Benutzer durch das Formular auswählen lasse, wer sich im Raum befindet, wird er gespeichert, aber wenn ich den ersten Benutzer über $ room-> users = [$ user_field] hinzufügen möchte, ; es wird nicht gespeichert. Ich logge $ room-Objekt in die Datei und beide Objekte sind gleich (nach dem Hinzufügen von Benutzer über das Formular und nach dem Hinzufügen von Benutzer durch den Code). Helfen Sie mir :(

Vielleicht sollte ich before() oder aftersave() in Modell?

SOLUTION ich eine Lösung mit Code.Working-Hilfe. Statt

$this->loadModel('Users'); 
des Hinzufügens

zum initializie() -Methode ich habe es nur in meinem createRoom() Funktion.

Schlussarbeits Code lik sieht e dies:

//Create room 
public function createRoom(){ 
    $this->loadModel('Users'); 
    $room = $this->Rooms->newEntity(); 
    if($this->request->is('post')){ 
     $room = $this->Rooms->patchEntity($room, $this->request->data); 
     $user_field = $this->Users->get($this->Auth->user('id')); 
     $room->users = [$user_field]; 
     $room->current = 1; 
     $room->owner_id = $this->Auth->user('id'); 
     Log::debug($room); 
     if($this->Rooms->save($room)){ 
      $this->Flash->success('You have created a new room.'); 
      return $this->redirect(['action' => 'index']); 
     } 
     else{ 
      $this->Flash->error('Error creating new room.'); 
     } 
    } 
    $games = $this->Rooms->Games->find('list', ['limit' => 200, 'keyField' => 'id', 'valueField' => 'name']); 
    $this->set(compact('room', 'games', 'users')); 
    $this->set('_serialize', ['room']); 
} 

Antwort

0

Wenn Sie die Gruppe von Benutzern auf einen spezifischen nicht reduzieren, ist der zurückgehende Wert von find() immer ein Abfrageobjekt: Retrieving Data & Results Sets.

Versuchen Sie stattdessen die Menge der abgerufenen Benutzer auf den ersten zu reduzieren:

$user_field = $this->Rooms->Users->find()->where(['id' => $this->Auth->user('id')])->first(); 

Oder besser, wenn die ‚id‘ Spalte Primärschlüssel ist:

// In the initialize() method 
$this->loadModel('Users'); 

// And in the action: 
$user_field = $this->Users->get($this->Auth->user('id')); 
+0

hey, danke für die Antwort. Wo ich Ihre Lösung in meine Steuerung gesetzt habe, habe ich folgenden Fehler bekommen: Aufruf einer Member-Funktion user() auf boolean. Was soll ich damit machen? – Barteo

+0

Haben Sie das Auth Plugin geladen? Es kann helfen, Auth in einer Variablen und print_r() in der Ansicht zu speichern. Wie $ this-> set ('auth', $ this-> Auth); In der Ansicht: print_r ($ auth); –

0

ich das erraten würde helfen, u:

http://api.cakephp.org/3.2/class-Cake.ORM.Association.BelongsToMany.html#_link

mit Link kannst Du Der Benutzer Objekt zu den Räumen Objekt leicht und es ist die schönere Lösung, die ich denke. Angenommen, Sie haben Verbindungen richtig eingerichtet!

Viel Glück :)

+0

was ist komisch, ich habe es geschafft "Benutzer später" "Verknüpfung", aber ich konnte nicht "Link" zu arbeiten.krank verbringen etwas mehr Zeit damit und versuchen, eine Antwort zu finden. Danke für den Tipp! – Barteo

0

denke ich, eine andere Methode von dem Modell in Ihrem Controller Laden könnte die dirty() Methode werden. In Ihrem Fall werden Sie $rooms->dirty('users', true); direkt nach Log::debug($room); einfügen und das Lastmodell der Benutzer kommentieren. Dies wird die "Benutzer" Assoziation der "Zimmer" als schmutzig signalisieren, und daher wird es speichern, wenn $this->Rooms->save($room) aufgerufen wird.

Probieren Sie es aus;)