122 votes

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

Un User a un Package qui lui est associé. Plusieurs utilisateurs peuvent se référer au même paquet. User ne peut exister sans un Package définis. User devrait posséder la relation. La relation est bidirectionnelle, de sorte qu'un Package contient zéro ou plusieurs utilisateurs.

Ces exigences conduisent à ManyToOne relation pour User y OneToMany relation de Package dans la doctrine 2. Cependant, les package_id en user (qui est une clé étrangère) permet à null valeurs. J'ai essayé de définir nullable=false mais commande :

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

Dit qu'il n'y a pas d'attribut nullable pour la relation ManyToOne . Qu'est-ce qui 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;

}

220voto

Sgoettschkes Points 5963

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. La colonne JoinColumn, en revanche, identifie la colonne dans la base de données. Vous pouvez donc utiliser des attributs "normaux" comme nullable ou unique !

3voto

MauroB Points 226

Seulement @ORM\JoinColumn(nullable=false) est nécessaire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X