我目前正在寻找一种方法来为我们的一个客户在多个Symfony2应用程序之间共享用户。在过去的3年中,我们为他们制作了一些具有不同用途的应用程序(4),但始终使用“相同”的用户模型和数据。
目前,我们有4个独立的数据库,其中“users”表在所有应用程序上都是相同的,除了多对多关系。起初,我正在考虑添加第二个实体管理器(和连接),并将用户放在一个单独的数据库中。所有应用程序都可以使用它,所有用户都拥有相同的凭据。但是我如何处理多对多关系呢?
举一个例子,在应用程序A上,您具有从“用户”到“客户端”的多对多关系,但应用程序B / C / D中不存在“客户端”表。在应用程序B上,您具有从“用户”到“供应商”的多对多关系,但应用程序A / C / D中不存在“供应商”表等。将“客户端”或“供应商”表移动到共享数据库也不是一种选择,因为其他实体(不共享)也与这些表有关系。
我基本上需要找到一种方法来映射“共享用户”模型/数据库中的多对多关系,这些关系对于每个应用程序都是唯一的。有没有办法用多个数据库实现这一目标?我应该采取其他方法吗?
欢迎所有信息。提前谢谢。
答案 0 :(得分:3)
使用不同的连接,开箱即用的Doctrine似乎无法实现这一点。
已经回答了类似的问题:
如第一个答案所述,您可以执行以下操作:
通过保存相关对象的标识符(旧样式)而不是对它们的引用来保持对象图形断开连接,然后通过服务手动获取对象。
但是,如果您希望Doctrine真正了解关联,则需要将关联实体保留在同一数据库中,否则您的映射只会产生错误。这意味着您需要复制用户实体。
在非常特殊的情况下,您可以使用相同的连接(即,在同一主机上使用同一个DBMS的多个数据库并且具有相同的用户),似乎有一种方法,但我还没有测试过它: https://techpunch.co.uk/development/using-multiple-databases-with-symfony2-and-doctrine2
我们的想法是为每个表添加数据库名称前缀,就好像它是模式名称一样,如下所示:
此实体映射到数据库«users»中的«User»表:
<?php
namespace Demo\UserBundle\Entity;
use DoctrineORMMapping as ORM;
/**
* @ORMTable(name="users.User")
*/
class User
{
/* ... */
}
这个映射到数据库«posts»中的«Post»表:
<?php
namespace Demo\PostBundle\Entity;
use DoctrineORMMapping as ORM;
/**
* @ORMTable(name="posts.Post")
*/
class Post
{
/* ... */
}
然后你可以像往常一样建立联想:
class Post
{
/**
* @ORM\ManyToOne(targetEntity="\Demo\UserBundle\Entity\User")
**/
private $user;
/* ... */
}
作者还链接到github上的示例项目: https://github.com/lobsterdore/symfony2-multiple-db-example