Symfony2:如何考虑其映射实体加载用户?

虽然我正在使用带有FOSUserBundle的Symfony 2.1并且一切运行正常,但我不知道如何解决问题.

基本上,我想知道是否有一种方法可以从数据库中找到(加载或获取)用户,同时考虑到与另一个实体的关系.

情况就是这样:

我已经让用户也可以通过社交网络(Google,Facebook,LinkedIn等)登录我的网站.我还要求他们进行离线访问,这样我就可以随时访问他们的社交帐户了.

由于每个用户可以拥有他们想要的任意数量的连接(或者可能没有他们是选项),我决定不将这些信息保存在用户表中.我创建了一个名为“SocialConnection”的抽象实体,它由真实的(Google,Facebook等)扩展.在这个实体中,我存储了当用户通过这些网络(user_id,social_id,access_token等)登录我的网站时获得的用户信息,所以在我的User类中,我已经映射了一个抽象的“SocialEngine”集合,它允许我将所有网络放在一起.

为了能够在未来添加其他网络,如Twitter,雅虎等,我认为应该如此.

所以,现在的问题是当用户通过任何这些社交网络登录我的网站时,我需要从数据库中加载他知道他的社交ID,但我不知道该怎么做.

我已经看到UserManager的方法$this-> findUserBy找到了一个关于属性的用户,但我认为情况并非如此.

我该怎么做才能找到一个好的解决方案?

提前致谢.

最好的祝福,
的Izzy.

最佳答案 要实现这一点,你需要更深入地了解doctrine的api.基本存储库方法(find,findBy等…)是不够的.

您需要使用doctrine’s DQL.它看起来像SQL,但您根据映射元数据进行查询,而不是直接基于数据库模式.

如果您的用户具有SocialEngine的OneToMany $socialAccounts属性.您将能够执行以下操作:

SELECT u
FROM Bundle:User AS u
JOIN u.socialAccounts AS sa
WHERE sa.id = 34

但是你只能在SocialEngine的属性上查询,而不能在子类上查询…(即:你不能在SocialFacebookEngine的facebookId上查询).

您必须将所有twitter / facebook / etc数据放在User类的基础SocialEngine类中.
或者,您可以为每个“社交引擎”创建一个实体,并在每个引擎和用户之间创建一个OneToOne关系关系.

点赞