osob.de Unicorn Logo
Blogpost overview

Wenn CakePHP einen Eintrag nicht speichern will (oder auch: Hilfe, patchEntity funktioniert nicht) | 17.07.2018

(Copyright des Bildes siehe Credits)

Gestern Abend habe ich etwas an einem Code herumgespielt. Ich habe ein neues Model erstellt - natürlich mit Table und Entity Datei. Als ich dann aber Daten in der Datenbank verändern bzw. updaten wollte, funktionierte es nicht. Die Suche hat mich verrückt werden lassen.

Das Problem war, dass patchEntity keine Veränderung herbeiführte:

<?php
var_dump($data); 
$DataTable->patchEntity($data, ['active' => 2]);
var_dump($data);

erzeugte folgende Ausgabe:

object(Cake\ORM\Entity)[365]  
  public 'user_role_name' => string 'ADMIN' (length=5)
  public 'active' => int 1

object(Cake\ORM\Entity)[365]  
  public 'user_role_name' => string 'ADMIN' (length=5)
  public 'active' => int 1

Dabei war der Fehler so lächerlich simpel: Ich habe einfach aus alter Gewohnheit im Plural gearbeitet.

You like what you find here? A donation helps to keep this project running.

CakePHP hat bis zur Version 2 aus gewissen Model-Namen die Mehrzahl erzeugt. So wurde aus User Users und Member Members. Im Grunde ist die Idee korrekt, da das Model ja eine Datenbanktabelle beschreibt und in dieser viele Objekte (Entities) gespeichert werden. Demnach sollte der Entwickler die Tabelle auch users und nicht user nennen.

CakePHP zwang in Versionen vor 3.0 die Nutzer zu der Konvention der Bezeichnung. Mit der Version 3.0, die auch viele weitere Vorteile bringt, ist dieser Zwang weggefallen. Die Konventionen, die CakePHP noch nutzt, sind auf der Übersicht CakePHP Conventions aufgelistet und eigentlich intuitiv.

Wenn also patchEntity nicht funktioniert, einfach mal die Namen der Tabelle bzw. des Entities (wobei hier weniger das Problem liegen dürfte) überprüfen, ob diese mit dem Tabellennamen in der Datenbank übereinstimmen.

Update

Natürlich sollten die Felder auch nicht durch $_accessible in der Entity gesperrt werden. Nur so als kleiner Hinweis am Rande ;)

Credits

Beitragsbild von Free-Photos Pixabay. CC0 Creative Commons: Freie kommerzielle Nutzung, kein Bildnachweis nötig