2011-05-26 7 views
43

Tengo una relación ManyToOne en una de mis entidades, así:Doctrina 2 - No permitir valor nulo en las claves externas de las relaciones ManyToOne

class License { 
    // ... 
    /** 
    * Customer who owns the license 
    * 
    * @var \ISE\LicenseManagerBundle\Entity\Customer 
    * @ORM\ManyToOne(targetEntity="Customer", inversedBy="licenses") 
    * @ORM\JoinColumn(name="customer_id", referencedColumnName="id") 
    */ 
    private $customer; 
    // ... 
} 

class Customer { 
    // ... 
    /** 
    * Licenses that were at one point generated for the customer 
    * 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * @ORM\OneToMany(targetEntity="License", mappedBy="customer") 
    */ 
    private $licenses; 
    // ... 
} 

Esto genera un esquema de base de datos en el campo "customer_id" de la licencia la tabla puede ser nula, que es exactamente lo que no quiero.

Aquí hay algo de código en la que se crea un registro para demostrar que de hecho permite valores nulos para los campos de referencia:

$em = $this->get('doctrine')->getEntityManager(); 
$license = new License(); 
// Set some fields - not the reference fields though 
$license->setValidUntil(new \DateTime("2012-12-31")); 
$license->setCreatedAt(new \DateTime()); 
// Persist the object 
$em->persist($license); 
$em->flush(); 

Básicamente, no quiero una licencia para ser persistió sin tener un cliente asignado a eso. ¿Hay alguna anotación que deba establecerse o debería simplemente exigir que se pase un objeto del Cliente al constructor de mi Licencia?

El motor de base de datos que uso es MySQL v5.1, y estoy usando Doctrine 2 en una aplicación Symfony2.

+0

¿Tiene el código que en realidad se crea el registro? ¿Estás usando MySQL? –

+0

@ abe-petrillo Estoy usando MySQL 5.1. He actualizado la pregunta con una muestra de código donde creo un registro. –

+2

Lo encontré yo mismo. Según [la referencia de anotación de doctrina] (http://www.doctrine-project.org/docs/orm/2.0/en/reference/annotations-reference.html#joincolumn), hay una opción 'nullable' para' @ Column' y '@ JoinColumn' anotaciones. Establecerlo en falso conduce al comportamiento que quería. –

Respuesta

1

Sólo publicar porque @ zim32 no saber dónde hay que poner la declaración, por lo que tuvo que hacer una prueba y error.

Yaml:

manyToOne: 
    {field}: 
     targetEntity: {Entity} 
     joinColumn: 
      name: {field} 
      nullable: false 
      referencedColumnName: {id} 
     cascade: ['persist'] 
Cuestiones relacionadas