Доктрина 1.2: Как я могу предотвратить назначение противопоказания обеим сторонам отношения «один ко многим» - PullRequest
0 голосов
/ 12 апреля 2010

Есть ли способ помешать Доктрине назначить противопоказание с обеих сторон отношений один на один? Я пытался переместить определение из одной стороны в другую и использовать собственную сторону, но оно по-прежнему накладывает ограничение на обе таблицы. когда я хочу, чтобы родительская таблица имела ограничение - т.е. родитель может не иметь ассоциированного ребенка.

Например, я хочу использовать следующую схему sql:

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`)
);

Однако я получаю что-то вроде этого:

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`)
);

Я мог бы просто удалить ограничение вручную или изменить свои средства доступа, чтобы они возвращали / устанавливали одну сущность в коллекции (используя один-ко-многим), но, похоже, должен быть встроен способ справиться с этим.

Также я использую Symfony 1.4.4 (банкомат для установки в виде груш) - в случае, если проблема связана с sfDoctrinePlugin и не обязательно с самой Doctrine.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2010

sfDoctrinePlugin настраивает построитель модели доктрины таким образом, чтобы автоматически создавать противоположные боковые связи. В PHP 5.2 вы ничего не можете сделать с этим.

Начиная с PHP 5.3, где ReflectionProperty::setAccessible() доступен метод , вы можете манипулировать защищенными / закрытыми свойствами экземпляра Doctrine_Relation_Parser, который можно получить с помощью $this->getTable()->getRelationParser(). Поэтому вы должны переопределить метод BaseSomething::setUp() и удалить ненужные отношения вручную, используя API отражения php. Вы должны использовать API отражения, потому что Doctrine_Relation_Parser не предоставляет метод, который позволяет удалять отношения по желанию.

1 голос
/ 25 сентября 2013

Я решил это, установив состояние доктрины для противоположного «нулевого объекта» ДО мы сохраняем запись:

/* @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();
...