2016-02-28 23 views
2

我有權利:學說,如何留下未加入的實體?

CREATE TABLE `rights` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `U_name` (`name`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB; 

和配置文件:

CREATE TABLE `profile` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `U_name` (`name`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB; 

我想profiles連接rights並配置文件到配置文件:

CREATE TABLE `profile_profile` (
    `profile_id1` INT(10) UNSIGNED NOT NULL DEFAULT '0', 
    `profile_id2` INT(10) UNSIGNED NOT NULL DEFAULT '0', 
    PRIMARY KEY (`profile_id1`, `profile_id2`), 
    INDEX `I_profile_id2` (`profile_id2`), 
    CONSTRAINT `FK_profile_profile-profile-1` FOREIGN KEY (`profile_id1`) REFERENCES `profile` (`id`) ON UPDATE CASCADE ON DELETE CASCADE, 
    CONSTRAINT `FK_profile_profile-profile-2` FOREIGN KEY (`profile_id2`) REFERENCES `profile` (`id`) ON UPDATE CASCADE ON DELETE CASCADE 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB; 

CREATE TABLE `profile_right` (
    `profile_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', 
    `right_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', 
    PRIMARY KEY (`profile_id`, `right_id`), 
    INDEX `I_right_id` (`right_id`), 
    CONSTRAINT `FK_profile_right-profile` FOREIGN KEY (`profile_id`) REFERENCES `profile` (`id`) ON UPDATE CASCADE ON DELETE CASCADE, 
    CONSTRAINT `FK_profile_right-rights` FOREIGN KEY (`right_id`) REFERENCES `rights` (`id`) ON UPDATE CASCADE ON DELETE CASCADE 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB; 

一個更好的概述:enter image description here

名讓我產生的實體:

PHP應用程序/ doctrine.php開發的ORM:生成實體庫/ --no備份 --extend = 「\原則\實體\ BaseEntity」

這裏出現問題。 ProfileRights實體被創建,而不是Profile_rightsProfile_profile。那麼如何使用它們呢?

+1

你想用它們做什麼? – 1ed

+0

我想獲取配置文件的權限,例如 –

+0

以及如果我只想插入新條目,該怎麼辦? –

回答

2

在原則中,連接表不是由實體表示的。

您可以在您的實體中找到@ORM\ManyToMany,其中包含@ORM\JoinTable以及關於您的關聯的所有信息。
這是你的連接表的表示,使用getter和setter,就像@Richard說的那樣訪問它們。

Associations mapping(查看所有類型的關聯)和Working with associations(學習如何與他們合作)文檔的章節中獲取更多信息。

希望你對教條有很好的體會。

編輯

看看你的UML更後,您的關聯的至少一個不需要多到很多(正如所說的第一個答案),但如果他們真的有連接表在SQL中,並且通過逆向工程導入它們,它們肯定會與SQL中的一樣(帶有連接表的多對多)。

+0

如果我爲他們手動創建實體/存儲庫,這是一個大罪? –

+2

這將是無用的。像我解釋的那樣使用關聯是在教義中正確管理外鍵的唯一方法。否則,這不是教條。但別擔心!這是一個非常直觀的工具,您可以輕鬆學習。 – chalasr

2

如果您想訪問ManyToMany關係中的加入實體,則需要將其分解爲OneToMany,ManyToOne。

E.g.

簡介 - OneToMany <簡介> ManyToOne - 簡介。

是否應該是另一個問題。你只需要需要這樣做,如果你想在連接表上存儲額外的數據。

隨着你在那裏得到一個配置文件的權利是微不足道的。對於已加載任何個人資料,你只需撥打

$profile->getRights() 

和學說將(假設你生成的實體的映射是正確的)透明獲取爲您基於連接表的所有相關權利的實體。

同樣,如果你一個右鍵添加到配置文件:

$right = new Right(); 
$profile->addRight($right); 

學說將增加透明爲你的連接表項。

+0

如果我爲他們手動創建實體/存儲庫,這是一個大罪? –

+1

沒有什麼能夠阻止你,但是就像我說的,除非你想在連接表上存儲額外的數據,否則沒有真正的意義。此外,您需要更改實體中關係的類型。除非您適合額外的數據場景,否則我不會推薦它,否則它是毫無意義的。 – Richard

+2

正如@chalasr所說,給它一個機會,不要與ORM對抗,它真的非常擅長它。 – Richard