O Doctrine 2 não pode usar nullable = false na relação manyToOne?

110

Um Usertem um Packageassociado a ele. Muitos usuários podem se referir ao mesmo pacote. Usernão pode existir sem um Packagedefinido. Userdeve possuir a relação. A relação é bidirecional, portanto, a Packagetem zero ou mais usuários.

Esses requisitos levam à ManyToOnerelação para Usere à OneToManyrelação de Packagena Doutrina 2. No entanto, package_idna usertabela (que é chave estrangeira) permite nullvalores. Eu tentei definir, nullable=falsemas comandar:

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

Diz que não há atributo nullablepara a relação ManyToOne. O que estou perdendo?

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 : resolvido. observe que isso está errado (observe as aspas duplas):

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

Embora isso seja correto:

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

Respostas:

193

Use a anotação JoinColumn em sua relação ManyToOne:

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

O próprio ManyToOne não pode ser anulável, porque não está relacionado a uma coluna específica. O JoinColumn, por outro lado, identifica a coluna no banco de dados. Assim, você pode usar atributos "normais" como anuláveis ​​ou únicos!

Sgoettschkes
fonte
Obrigado, eu tentei, mas infelizmente a coluna package_idainda está sinalizada como Null - Sim, Padrão - NULL. Qualquer ajuda é muito apreciada.
gremo
5
Esqueça, uma aspa dupla quebra completamente a coisa. Isso nullable="false"está errado!
gremo
Você tentou excluir o banco de dados totalmente e criá-lo novo? Acabei de dar uma olhada em meu banco de dados (usando a mesma anotação JoinColumn mencionada acima) e está sinalizado como NotNull!
Sgoettschkes
5
Obrigado por isso, eu estava me perguntando por que não consegui @ORM\Column(nullable=true)tornar meu manytoone anulável!
Scott Flack
Se você configurou a opção certa e ainda vê a coluna do banco de dados com o valor errado, lembre-se de limpar o cache de metadados para o Entity Manager. No Symfony, você pode usar o console doctrine:cache:clear-metadatacomando
Massimiliano Arione