¿Doctrine 2 no puede usar nullable = false en la relación manyToOne?

110

An Usertiene uno Packageasociado. Muchos usuarios pueden hacer referencia al mismo paquete. Userno puede existir sin un Packagedefinido. Userdebe ser dueño de la relación. La relación es bidireccional, por lo que a Packagetiene cero o más usuarios.

Estos requisitos conducen a una ManyToOnerelación para Usery una OneToManyrelación de Packageen Doctrine 2. Sin embargo, package_iden la usertabla (que es una clave externa) permite nullvalores. He intentado configurar nullable=falsepero comando:

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

Dice que no hay ningún atributo nullablepara la relación ManyToOne. ¿Qué me estoy perdiendo?

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;

}

EDITAR : resuelto. tenga en cuenta que esto es incorrecto (tenga en cuenta las comillas dobles):

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

Si bien esto es correcto:

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

Respuestas:

193

Utilice la anotación JoinColumn en su relación ManyToOne:

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

ManyToOne en sí mismo no puede ser anulable, porque no se relaciona con una columna específica. JoinColumn, por otro lado, identifica la columna en la base de datos. Por lo tanto, puede usar atributos "normales" como nulos o únicos.

Sgoettschkes
fuente
Gracias, lo he intentado, pero desafortunadamente la columna package_idtodavía está marcada como Null - Yes, Default - NULL. Cualquier ayuda es muy apreciada.
Gremo
5
No importa, una comilla doble rompe completamente la cosa. ¡Eso nullable="false"está mal!
Gremo
¿Intentó eliminar la base de datos por completo y crearla nueva? Acabo de echar un vistazo a mi base de datos (usando la misma anotación JoinColumn como se mencionó anteriormente) y está marcada como NotNull.
Sgoettschkes
5
Gracias por esto, me preguntaba por qué no podía hacer que @ORM\Column(nullable=true)mi manytoone aceptara nulos.
Scott Flack
Si configuró la opción correcta y aún ve la columna de su base de datos con el valor incorrecto, recuerde borrar la caché de metadatos para Entity Manager. En Symfony, puedes usar el console doctrine:cache:clear-metadatacomando
Massimiliano Arione