2016-03-02 93 views
1

我最近在我的web服务器上安装了Doctrine2,并且所有的工作都很好。我已经建立了所有的实体,但现在我正在创建一个查找表,我有点困惑如何做到这一点。我希望有一个表,看起来像这样:用Doctrine2创建查找表

tbl_Role      tbl_User 
+--------+----------+   +--------+----------+--------------+----------+ 
| id | Name |   | id | Name | Password | Role | 
+--------+----------+   +--------+----------+--------------+----------+ 
| 1 | Admin | 
| 2 | User | 
| 3 | Free | 
+--------+----------+ 

RoleUser表之间由一个一对多的关系(一个Role有许多Users),这表不会改变未来。我不想使用枚举,因为它们的更新或重新排序问题(如果有更改)

我现在的问题是我如何能够将此查找表表示为Doctrine实体?通常,如果我想创建一个新的User,我必须从DB获取拟合Role,并将其设置为User实体中的参考。这对我来说似乎有点贵。如果我只能在静态PHP字段中输入Role ID,那么我可以将它们设置为User的参考。这可能吗?

另一个问题是我如何获取查找值到数据库中。我可以在Role表中创建Role表后执行一个方法吗?这样就可以将构造函数标记为私有的,并且在迁移后所有值都存在。

+0

您知道Doctrine的参考吗? https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/EntityManager.php#L374-413。给定角色的实际数据库ID,获取原则参考价格便宜。我仍然试图将角色存储为一个字符串,并且根本就没有Doctrine 2关系。如果您愿意,您仍然可以制作其他软件的角色表。 – Cerad

回答

1

首先,它不会太昂贵,因为Doctrine2 has a few cache layers和这些查询将被高效缓存,因为Role表不会变化。

无论如何,如果Role表不会改变,我不确定它是否应该保存在数据库中。您可以为其创建一个“静态”工厂服务,以创建简单的值对象作为您的域图层的一部分。

+0

我想我明白你的意思,但我想在数据库中有这张表。这是一个非常重要的关系,如果你只查看数据库(没有工厂),如果这个表不可用,就没有引用这个integeres。这是一个设计理念,我不情愿地打破它。 – Cilenco

+0

那么,你应该设计你的软件,而不是数据库。 DB只是一个I/O。无论如何,正如答案中所提到的,由于Doctrine的缓存层,它不应该成为问题。 –