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)
Gremo
quelle

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!

Sgoettschkes
quelle
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