Doctrine 2 non può usare nullable = false nella relazione manyToOne?


110

An ne Userha uno Packageassociato. Molti utenti possono fare riferimento allo stesso pacchetto. Usernon può esistere senza un Packagedefinito. Userdovrebbe possedere la relazione. La relazione è bidirezionale, quindi a Packageha zero o più utenti al suo interno.

Questi requisiti portano alla ManyToOnerelazione per Usere alla OneToManyrelazione di Packagein Dottrina 2. Tuttavia package_idnella usertabella (che è la chiave esterna) consente i nullvalori. Ho provato a impostare nullable=falsema comando:

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

Dice che non ci sono attributi nullableper la relazione ManyToOne. Cosa mi manca?

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 : risolto. tieni presente che questo è sbagliato (nota le virgolette doppie):

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

Anche se questo è corretto:

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

Risposte:


193

Usa l'annotazione JoinColumn sulla tua relazione ManyToOne:

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

Lo stesso ManyToOne non può essere annullabile, perché non è correlato a una colonna specifica. La JoinColumn d'altra parte identifica la colonna nel database. Quindi, puoi usare attributi "normali" come nullable o univoco!


Grazie, ho provato ma sfortunatamente la colonna package_idè ancora contrassegnata come Null - Sì, Default - NULL. Ogni aiuto è molto apprezzato.
gremo

5
Non importa, una doppia virgoletta rompe completamente la cosa. È nullable="false"sbagliato!
gremo

Hai provato a eliminare completamente il database e a crearlo nuovo? Ho appena dato un'occhiata al mio database (usando la stessa annotazione JoinColumn di cui sopra) ed è contrassegnato come NotNull!
Sgoettschkes

5
Grazie per questo, mi stavo chiedendo perché non sono riuscito @ORM\Column(nullable=true)a rendere il mio manytoone nullable!
Scott Flack

Se hai configurato l'opzione giusta e vedi ancora la colonna del database con il valore sbagliato, ricorda di cancellare la cache dei metadati per Entity Manager. Su Symfony, puoi usare il console doctrine:cache:clear-metadatacomando
Massimiliano Arione
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.