Doctrine 2 ne peut pas utiliser nullable = false dans une relation manyToOne?

110

An en Usera un Packageassocié. De nombreux utilisateurs peuvent se référer au même package. Userne peut exister sans un Packagedéfini. Userdevrait posséder la relation. La relation est bidirectionnelle, donc a Packagen'a aucun utilisateur ou plus.

Ces exigences mènent à la ManyToOnerelation pour Useret à la OneToManyrelation de Packagedans Doctrine 2. Cependant, package_iddans la usertable (c'est-à-dire la clé étrangère) autorise les nullvaleurs. J'ai essayé de régler nullable=falsemais commande:

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

Dit qu'il n'y a pas d'attribut nullablepour la relation ManyToOne. Qu'est-ce qu'il me manque?

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 : résolu. veuillez noter que c'est faux (notez les guillemets):

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

Bien que ce soit correct:

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

Réponses:

193

Utilisez l'annotation JoinColumn sur votre relation ManyToOne:

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

Le ManyToOne lui-même ne peut pas être nullable, car il ne se rapporte pas à une colonne spécifique. Le JoinColumn, quant à lui, identifie la colonne dans la base de données. Ainsi, vous pouvez utiliser des attributs "normaux" comme nullable ou unique!

Sgoettschkes
la source
Merci, j'ai essayé, mais malheureusement, la colonne package_idest toujours marquée comme Null - Oui, par défaut - NULL. Toute aide est très appréciée.
gremo
5
Tant pis, une double citation casse complètement la chose. C'est nullable="false"faux!
gremo
Avez-vous essayé de supprimer la base de données dans son intégralité et d'en créer une nouvelle? Je viens de jeter un œil à ma base de données (en utilisant la même annotation JoinColumn que celle mentionnée ci-dessus) et elle est marquée comme NotNull!
Sgoettschkes
5
Merci pour cela, je me demandais pourquoi je ne pouvais pas faire @ORM\Column(nullable=true)en sorte que mon manytoone soit nul!
Scott Flack
Si vous avez configuré la bonne option et que vous voyez toujours votre colonne de base de données avec la mauvaise valeur, n'oubliez pas de vider le cache de métadonnées pour Entity Manager. Sur Symfony, vous pouvez utiliser la console doctrine:cache:clear-metadatacommande
Massimiliano Arione