2010-04-12 18 views
-1

有沒有一種方法可以防止主體在一對一關係的雙方上分配一個限制?我嘗試將定義從一方移到另一方,並使用擁有方,但它仍然對兩個表都設置了約束。當我只想要父表有一個約束 - 即。其父母可能沒有關聯的孩子。學說1.2:我如何防止將一個約束分配給一對多關係的雙方?

例如iwant實質上包含以下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(梨安裝ATM) - 以防其sfDoctrinePlugin問題,而不一定是學說本身。

回答

2

sfDoctrinePlugin以自動創建對立關係的方式配置原則模型構建器。在PHP 5.2中,你無法做任何事情。

從PHP 5.3開始,其中ReflectionProperty::setAccessible() method可用,you could manipulate protected/private propertiesDoctrine_Relation_Parser實例,可通過$this->getTable()->getRelationParser()獲取實例。所以你必須重寫BaseSomething::setUp()方法並使用php的反射API手動刪除不需要的關係。您必須使用反射API,因爲Doctrine_Relation_Parser未提供允許隨意刪除關係的方法。

+0

因此,它是專門針對Symfony和不學說?我問,因爲我在symfony做了一些快速原型,但最終的應用程序將在Zend開發/編寫。所以如果這不是教義問題,我只需要爲他們找到一個解決方法 - 如果其實際上有問題的教條不得不做更多的事情。 – prodigitalson 2010-04-13 04:30:40

+0

那麼,這不是教義問題,甚至不是一個問題 - 它只是一個配置參數。 – develop7 2010-04-13 15:07:09

+0

有人可以在這方面投光嗎? 即使在這個雙關係混亂之後,我得到一個錯誤,說,Add方法對於子關係不存在。這是殺了我! – Prasad 2010-07-20 16:55:40

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