Doctrina 1.2: ¿Cómo puedo evitar una restricción de ser asignado a ambos lados de una relación de uno a muchos?

StackOverflow https://stackoverflow.com/questions/2623941

Pregunta

¿Hay una manera de prevenir la Doctrina de la asignación de un contraint a ambos lados de una relación uno-a-uno? He intentado mover la definición de un lado a otro y el uso de la posesión de lado, pero todavía es un factor limitante en ambas mesas. cuando sólo desea que la tabla padre para tener una restricción - es decir. su posible que los padres no tienen un hijo asociado.

Por ejemplo iwant el siguiente esquema sql esencialmente:

CREATE TABLE `parent_table` (
  `child_id` varchar(50) NOT NULL,
  `id` integer UNSIGNED NOT NULL auto_increment,
  PRIMARY KEY (`id`)
);

CREATE TABLE `child_table` (
  `id` integer UNSIGNED NOT NULL auto_increment,
  `child_id` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`child_id`),
  CONSTRAINT `parent_table_child_id_FK_child_table_child_id`
    FOREIGN KEY (`child_id`)
    REFERENCES `parent_table` (`child_id`)
);

Sin embargo Im consiguiendo algo como esto:

CREATE TABLE `parent_table` (
  `child_id` varchar(50) NOT NULL,
  `id` integer UNSIGNED NOT NULL auto_increment,
  PRIMARY KEY (`id`),
  CONSTRAINT `child_table_child_id_FK_parent_table_child_id`
    FOREIGN KEY (`child_id`)
    REFERENCES `child_table` (`child_id`)
);

CREATE TABLE `child_table` (
  `id` integer UNSIGNED NOT NULL auto_increment,
  `child_id` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`child_id`),
  CONSTRAINT `parent_table_child_id_FK_child_table_child_id`
    FOREIGN KEY (`child_id`)
    REFERENCES `parent_table` (`child_id`)
);

tan sólo pudiera eliminar la restricción manualmente o modificar mis descriptores de acceso al retorno / set una sola entidad en la colección (usando uno-a-muchos), pero parece que no debería construida en forma de manejar esto.

También im usando Symfony 1.4.4 (pera installtion ATM) -. En el caso de su un problema sfDoctrinePlugin y no necesariamente en sí Doctrina

¿Fue útil?

Solución

sfDoctrinePlugin configura modelo doctrina constructor de la manera que crea relaciones laterales opuestas de forma automática. En PHP 5.2 no se puede hacer nada con ella.

A partir de PHP 5.3, donde ReflectionProperty::setAccessible() método está disponible, que podía manipular protegidas privadas / de ejemplo Doctrine_Relation_Parser que se puede obtener por $this->getTable()->getRelationParser(). Así que hay que reemplazar el método BaseSomething::setUp() y soltar las relaciones que no sean necesarios de forma manual utilizando la API de reflexión de php. Usted tiene que utilizar la API de reflexión porque Doctrine_Relation_Parser no proporciona un método que permite dejar caer las relaciones a voluntad.

Otros consejos

He resuelto esto estableciendo el estado de la doctrina de lo contrario "objeto nulo" ANTES Guardar el registro:

/* @var $address Address */
$address = $form->getObject();

// the null object is here the "address position", let's change it's state
$address->getAddressPosition()->state(Doctrine_Record::STATE_CLEAN);

// now we can save the address and doctrine won't insert the null object
$address = $form->save();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top