Wie setze ich in Lehre 2 einen Standardwert?
php
orm
doctrine-orm
Jiew Meng
quelle
quelle
Antworten:
Datenbankstandardwerte werden nicht "portabel" unterstützt. Die Standardmethode für Datenbankwerte kann nur über das
columnDefinition
Zuordnungsattribut verwendet werden, in dem Sie dasSQL
Snippet (DEFAULT
einschließlich Ursache) für die Spalte angeben, der das Feld zugeordnet ist.Sie können verwenden:
Standardwerte auf PHP-Ebene werden bevorzugt, da diese auch für neu erstellte und persistierte Objekte ordnungsgemäß verfügbar sind (Doctrine kehrt nach dem Persistieren eines neuen Objekts nicht zur Datenbank zurück, um die Standardwerte zu erhalten).
quelle
Beachten Sie, dass hierfür SQL verwendet wird
DEFAULT
, das für einige Felder wieBLOB
und nicht unterstützt wirdTEXT
.quelle
options
Parameter ist auch fürunsigned
Werte nützlich . siehe diese Antwortoptions={"default": 0}
Achten Sie darauf, "und nicht" zu verwenden, da dies Fehler in meiner Version der Doktrin verursacht.Richten Sie einen Konstruktor in Ihrer Entität ein und legen Sie dort den Standardwert fest.
quelle
Verwenden:
und nicht:
Zum Beispiel:
quelle
Aktualisieren
Ein weiterer Grund, warum das Lesen der Dokumentation zu Symfony niemals aus dem Trend geraten wird. Für meinen speziellen Fall gibt es eine einfache Lösung, bei der die
field type
Optionempty_data
auf einen Standardwert gesetzt wird.Auch diese Lösung gilt nur für das Szenario, in dem eine leere Eingabe in einem Formular das DB-Feld auf null setzt.
Hintergrund
Keine der vorherigen Antworten hat mir bei meinem speziellen Szenario geholfen, aber ich habe eine Lösung gefunden.
Ich hatte ein Formularfeld, das sich wie folgt verhalten musste:
Ich habe dann alle hier gegebenen Empfehlungen ausprobiert. Lassen Sie mich sie auflisten:
WICHTIG
Symfony-Formularfelder überschreiben die in der Entitätsklasse festgelegten Standardwerte. Das bedeutet, dass in Ihrem Schema für Ihre Datenbank ein Standardwert definiert sein kann. Wenn Sie jedoch beim Senden Ihres Formulars ein nicht erforderliches Feld leer lassen, überschreibt die Methode
form->handleRequest()
in Ihrerform->isValid()
Methode diese Standardwerte in IhrerEntity
Klasse und setzt sie auf die Eingabefeldwerte. Wenn die Eingabefeldwerte leer sind, wird dieEntity
Eigenschaft auf festgelegtnull
.http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Meine Problemumgehung
Stellen Sie den Standardwert auf Ihrem Controller nach
form->handleRequest()
Ihrerform->isValid()
Methode ein:Keine schöne Lösung, aber es funktioniert. Ich könnte wahrscheinlich ein machen ,
validation group
aber es kann sein , Menschen , die dieses Problem als siehe Datentransformation statt Datenvalidierung , ich überlasse es Ihnen zu entscheiden.Setter überschreiben (funktioniert nicht)
Ich habe auch versucht, den
Entity
Setter folgendermaßen zu überschreiben :Dies funktioniert nicht , obwohl es sauberer aussieht . Der Grund dafür ist, dass die böse
form->handleRequest()
Methode nicht die Setter-Methoden des Modells verwendet, um die Daten zu aktualisieren (sieheform->setData()
für weitere Details).quelle
Die Problemumgehung, die ich verwendet habe, war a
LifeCycleCallback
. Ich warte immer noch darauf, ob es zum Beispiel mehr "native" Methoden gibt@Column(type="string", default="hello default value")
.quelle
if (!$this->getDtPosted()) { $this->setDtPosted(new \DateTime()); }
Sie können dies auch mit XML tun:
quelle
So habe ich es für mich gelöst. Unten finden Sie ein Entitätsbeispiel mit dem Standardwert für MySQL. Dies erfordert jedoch auch die Einrichtung eines Konstruktors in Ihrer Entität und das Festlegen des Standardwerts dort.
quelle
columnDefinition
geht direkt gegen den Zweck eines ORM, der Abstraktion von der Datenbank ist. Diese Lösung beeinträchtigt die Portabilität, hält Ihre Software von Ihrem DB-Anbieter abhängig und beeinträchtigt auch die Tools von Doctrine Migrations.Funktioniert für mich auch in einer MySQL-Datenbank:
quelle
Nichts davon hat bei mir funktioniert. Ich habe auf der Website der Doktrin eine Dokumentation gefunden, die besagt, dass der Wert direkt festgelegt werden soll, um einen Standardwert festzulegen.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/faq.html#how-can-i-add-default-values-to-a-column
Dies fügte den Wert ein, den ich wollte.
quelle
Hinzufügen zu @romanb brillante Antwort.
Dies erhöht den Aufwand bei der Migration geringfügig, da Sie offensichtlich kein Feld ohne Null-Einschränkung und ohne Standardwert erstellen können.
Mit dieser Antwort ermutige ich Sie zu überlegen, warum Sie überhaupt den Standardwert in der Datenbank benötigen. Und normalerweise ist es möglich, das Erstellen von Objekten ohne Null-Einschränkung zu ermöglichen.
quelle
Wenn Sie die Yaml-Definition für Ihre Entität verwenden, funktioniert Folgendes für mich in einer Postgresql-Datenbank:
quelle
$entity->setFieldName()
vor dem Spülen nicht verwendet haben? Doctrine scheint den Standardwert bei null zu definieren. Die einzige Lösung in yaml besteht darin, den Standardwert IN der Entitätsklasse zu definieren, der mir dumm erscheint, da er bereits in yaml definiert ist ... -_-Ich hatte mit dem gleichen Problem zu kämpfen. Ich wollte den Standardwert aus der Datenbank in die Entitäten (automatisch) haben. Ratet mal, ich habe es geschafft :)
quelle
Während das Festlegen des Werts im Konstruktor funktionieren würde, könnte die Verwendung der Doctrine Lifecycle-Ereignisse eine bessere Lösung sein.
Durch die Nutzung des
prePersist
Lifecycle-Ereignisses können Sie Ihren Standardwert für Ihre Entität nur beim anfänglichen Fortbestehen festlegen.quelle
hack
. Verlassen Sie sich niemals auf Hacks.Seien Sie vorsichtig, wenn Sie Standardwerte für die Eigenschaftsdefinition festlegen! Tun Sie es stattdessen im Konstruktor, um es problemlos zu halten. Wenn Sie es in der Eigenschaftsdefinition definieren, das Objekt in der Datenbank beibehalten und dann teilweise laden, haben nicht geladene Eigenschaften wieder den Standardwert. Das ist gefährlich, wenn Sie das Objekt erneut beibehalten möchten.
quelle