2012-02-07 31 views
6

Tengo una relación desde Assembly a ComponentSlot. Es una relación OneToMany.Doctrine/Symfony2 OneToMany foreign_id guardando como NULL

// Assembly 

/** 
* @ORM\OneToMany(targetEntity="ComponentSlot", mappedBy="assembly", cascade={"persist"}) 
* @Assert\Valid 
*/ 
protected $componentSlots; 

// ComponentSlot 

/** 
* @ORM\ManyToOne(targetEntity="Assembly", inversedBy="componentSlots") 
*/ 
protected $assembly; 

El esquema que esto ha generado en la base de datos está absolutamente bien. Corrija las columnas, corrija los índices y las relaciones.

El formulario Symfony2 AssemblyType tiene una colección de ComponentSlotType. Puedo agregar varios hijos ComponentSlot. Al persistir, los hijos Assembly y ComponentSlot se guardan perfectamente, excepto que assembly_id es NULL en la tabla de ranuras del componente.

He copiado la configuración que tenía en un proyecto anterior que salvó las relaciones muy bien, estoy completamente perplejo. La cascada persiste se establece en los campos componentSlots de Assembly y mi experiencia pasada con OneToMany es que no tengo que hacer nada especial aquí, se debe tener cuidado.

Cualquier indicador sería apreciado :)

+0

¿Cómo se establece la relación? ¿A qué métodos llamas? – greg0ire

+0

Como digo, tengo un proyecto que ya funciona con las relaciones OneToMany configuradas de la misma manera (claramente no). En ese proyecto, el padre tiene 'addLink (Link $ link)' y solo llama a '$ this-> link [] = $ link'. De hecho, la documentación en http://symfony.com/doc/2.0/book/doctrine.html confirma que la vinculación de los elementos de la colección principal y secundaria es automática. Esto debería ser automático, mi proyecto anterior, la documentación y el hecho de que doctrine: generate: entities no establece que la relación en el método auto-generate add sugiera que mi modelo está bien y algo más está mal – PorridgeBear

+0

Pensé que ya lo tenía casi ... por referencia en el campo de formulario de recopilación se omitió en lugar de establecerse en falso. Sin embargo, esto no alteró la identificación que se almacena para los niños. – PorridgeBear

Respuesta

4

compruebe su configuración anterior. Sospecho que tenías algo así como:

// Assembly 
public function addComponentSlot($componentSlot) 
{ 
    $this->componentSlots[] = $componentSlot; 

    $componentSlot->setAssembly($this); // Probably left this out when you copied? 
} 
+0

No, agregar esto no cambia nada. También probé esto en 'setComponentSlots' que Symfony2 usa a petición-> bindRequest para configurar los objetos y eso tampoco funciona. – PorridgeBear