Doctrine 2 nie może używać wartości nullable = false w relacji manyToOne?

110

UserMa jeden Packagez nim związane. Wielu użytkowników może odnosić się do tego samego pakietu. Usernie może istnieć bez Packageokreślonego. Userpowinien być właścicielem relacji. Relacja jest dwukierunkowa, więc Packagema zero lub więcej użytkowników.

Te wymagania prowadzą do ManyToOnerelacji dla Useri OneToManyrelacji Packagew Doktrynie 2. Jednak package_idw usertabeli (czyli klucza obcego) dopuszcza się nullwartości. Próbowałem ustawić, nullable=falseale polecenie:

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

Mówi, że nie ma atrybutu nullabledla relacji ManyToOne. Czego mi brakuje?

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;

}

EDYCJA : rozwiązana. pamiętaj, że to źle (zwróć uwagę na podwójne cudzysłowy):

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

Chociaż jest to poprawne:

@ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable=false)
gremo
źródło

Odpowiedzi:

193

Użyj adnotacji JoinColumn w swojej relacji ManyToOne:

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

Sam ManyToOne nie może mieć wartości null, ponieważ nie odnosi się do określonej kolumny. Z drugiej strony JoinColumn identyfikuje kolumnę w bazie danych. W ten sposób możesz używać „normalnych” atrybutów, takich jak nullable lub unique!

Sgoettschkes
źródło
Dzięki, próbowałem, ale niestety kolumna package_idjest nadal oznaczona jako Null - Tak, Domyślnie - NULL. Każda pomoc jest bardzo ceniona.
gremo
5
Nieważne, podwójny cudzysłów całkowicie przerywa sprawę. To nullable="false"jest złe!
gremo
Czy próbowałeś całkowicie usunąć bazę danych i utworzyć ją nową? Właśnie spojrzałem na moją bazę danych (używając tej samej adnotacji JoinColumn, jak wspomniano powyżej) i jest ona oznaczona jako NotNull!
Sgoettschkes
5
Dzięki za to, zastanawiałem się, dlaczego nie mogłem sprawić, @ORM\Column(nullable=true)by moje manytoone były zerowe!
Scott Flack,
Jeśli skonfigurowałeś właściwą opcję i nadal widzisz kolumnę bazy danych z niewłaściwą wartością, pamiętaj, aby wyczyścić pamięć podręczną metadanych dla Entity Manager. W Symfony możesz użyć console doctrine:cache:clear-metadatapolecenia
Massimiliano Arione