-1

有没有办法阻止 Doctrine 在一对一关系的双方分配约束?我尝试将定义从一侧移动到另一侧并使用拥有侧,但它仍然对两个表都施加了约束。当我只希望父表有一个约束时 - 即。父母可能没有关联的孩子。

例如,我本质上想要以下 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 (pear installtion ATM) - 如果它是 sfDoctrinePlugin 问题而不一定是 Doctrine 本身。

4

2 回答 2

2

sfDoctrinePlugin 以自动创建对立关系的方式配置学说模型构建器。在 PHP 5.2 中你不能用它做任何事情。

从 PHP 5.3 开始,如果ReflectionProperty::setAccessible()方法可用,您可以操作实例的受保护/私有属性Doctrine_Relation_Parser这些属性可以通过$this->getTable()->getRelationParser(). 因此,您必须BaseSomething::setUp()使用 php 的反射 API 手动覆盖方法并删除不需要的关系。您必须使用反射 API,因为Doctrine_Relation_Parser不提供允许随意删除关系的方法。

于 2010-04-12T20:07:04.727 回答
1

在我们保存记录之前,我已经通过为相反的“空对象”设置教义状态来解决这个问题:

/* @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();
于 2013-09-25T11:08:03.377 回答