In Doktrin 2 kann nullable = false in der Beziehung manyToOne nicht verwendet werden.


110

Einem Userist einer Packagezugeordnet. Viele Benutzer können auf dasselbe Paket verweisen. Userkann nicht ohne eine Packagedefinierte existieren. Usersollte die Beziehung besitzen. Die Beziehung ist bidirektional, daher Packagehat a null oder mehr Benutzer.

Diese Anforderungen führen zu ManyToOneBeziehung für Userund OneToManyBeziehung Packagein Lehre 2. Jedoch package_idin userTabelle (dh Fremdschlüssel) kann nullWerte. Ich habe versucht, nullable=falseaber Befehl:

 php app/console doctrine:generate:entities DL --path="src" --no-backup

Sagt, dass es kein Attribut nullablefür die Beziehung gibt ManyToOne. Was fehlt mir?

class User
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Package", inversedBy="users")
     */
    private $package;

}

class Package
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="User", mappedBy="package")
     */
    private $users;

}

EDIT : gelöst. Bitte beachten Sie, dass dies falsch ist (doppelte Anführungszeichen beachten):

 @ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable="false")

Während dies richtig ist:

@ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable=false)

Antworten:


192

Verwenden Sie die Annotation JoinColumn für Ihre ManyToOne-Beziehung:

/**
 * @ORM\ManyToOne(targetEntity="Package", inversedBy="users")
 * @ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable=false)
 */
private $package;

Das ManyToOne selbst kann nicht nullwertfähig sein, da es sich nicht auf eine bestimmte Spalte bezieht. Die JoinColumn hingegen identifiziert die Spalte in der Datenbank. Somit können Sie "normale" Attribute wie nullable oder unique verwenden!


Danke, ich habe es versucht, aber leider ist die Spalte package_idimmer noch als Null markiert - Ja, Standard - NULL. Jede Hilfe wird sehr geschätzt.
Gremo

5
Egal, ein doppeltes Anführungszeichen macht die Sache komplett kaputt. Das nullable="false"ist falsch!
Gremo

Haben Sie versucht, die Datenbank vollständig zu löschen und neu zu erstellen? Ich habe mir gerade meine Datenbank angesehen (mit der gleichen JoinColumn-Annotation wie oben erwähnt) und sie ist als NotNull gekennzeichnet!
Sgoettschkes

5
Vielen Dank dafür, ich hatte mich gefragt, warum ich es nicht schaffen konnte @ORM\Column(nullable=true), meinen Manytoone auf Null zu setzen!
Scott Flack

Wenn Sie die richtige Option konfiguriert haben und Ihre Datenbankspalte weiterhin mit dem falschen Wert angezeigt wird, müssen Sie den Metadaten-Cache für Entity Manager löschen. Auf Symfony können Sie console doctrine:cache:clear-metadataBefehl verwenden
Massimiliano Arione
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.