2012-04-08 14 views
7

Estoy en el proceso de convertir una aplicación PHP heredada a Symfony 2. Los datos de la aplicación no son muy consistentes en este momento, por lo que me gustaría evitar crear restricciones de clave externa. Tengo la siguiente anotación en mi clase de entidad "producto":Asociación de Doctrine 2 sin restricciones de clave externa

class Product { 

    // some definitions 

    /** 
    * @ORM\ManyToOne(targetEntity="Manufacturer") 
    * @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id") 
    */ 
    private $Manufacturer; 
} 

Cuando hago app/console doctrine:schema:update, me sale el comando SQL

ALTER TABLE products ADD CONSTRAINT FK_F6FA18741C3BF575 
    FOREIGN KEY (manufacturer_id) REFERENCES manufacturer(id); 

Como puedo evitar esto?

Respuesta

6

Básicamente no puede evitar que se generen los comandos sql. Al menos no sin zambullirte en el código de Doctrine.

Sin embargo, no es necesario que aplique las restricciones a su base de datos. D2 funcionará bien sin ellos.

+0

Sí, pero entonces no puedo usar el comando 'app/consola doctrina: esquema: actualización --force' más porque la actualización se detiene cuando se trata de ejecutar las restricciones FK. – chiborg

0

Debe omitir las definiciones ManyToMany y JoinColumn y manejar la propiedad del fabricante en su repositorio de productos personalizado con un método getManufacturer público que amplíe el repositorio de productos generado automáticamente.

0

Tuve un problema con el mismo comando. Obtuve la excepción:

SQLSTATE[HY000]: General error: 1005 Can't create table 'xxx.#sql-66c_3e' (errno: 150)

Para mí, ayudó a declarar la columna como única (en su caso, id).

Ahora app/console doctrine:schema:update funciona bien de nuevo.

12

tuve que pasar por el mismo proceso recientemente y, afortunadamente, hay una solución fácil, simplemente agregue nullable=true a la anotación de la columna.

Esto funcionará siempre que los datos existentes sean válidos, en mi caso tuve que cambiar los 0 a NULL y cambiar las claves que ya no existían a NULL.

+0

Esta debería ser la respuesta aceptada –

+5

La agregué a mi anotación 'JoinColumn' pero aún se está creando la restricción de clave externa. – flu

+1

igual que @flu - sin suerte, se está creando una clave foránea de todos modos –

-1

intenta agregar onDelete = "CASCADA" como

* @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id", onDelete="CASCADE") 
0

Tienes que establecer las claves externas perdidas a NULL, entonces se puede establecer su contstraint. Tras la consulta que da los identificadores de conjuntos de datos para cambiar:

select p.id from product p 
left join manufacturer m on m.id=p.manufakturer_id 
where m.id is null 
Cuestiones relacionadas