虽然我正在使用带有FOSUserBundle的Symfony 2.1并且一切正常,但我不知道如何解决问题。
基本上,我想知道是否有办法从数据库中找到(加载或获取)用户,同时考虑到与另一个实体的关系。
情况就是这样:
我已经让用户也可以通过社交网络(Google,Facebook,LinkedIn等)登录我的网站。我还要求他们进行离线访问,这样我就可以随时访问他们的社交帐户了。
由于每个用户可以拥有任意数量的连接(或者可能没有,因此他们是选项),我决定不将这些信息保存在用户表中。我创建了一个名为“SocialConnection”的抽象实体,它由真实的(Google,Facebook等)扩展。在这个实体中,我存储了当用户通过这些网络(user_id,social_id,access_token等)登录我的网站时获得的用户信息,所以在我的User类中,我已经映射了一个抽象的“SocialEngine”集合,它允许我将所有网络放在一起。
为了能够在未来添加其他网络,如Twitter,Yahoo等,我认为应该如此。
所以,现在的问题是,当用户通过任何这些社交网络登录我的网站时,我需要从数据库中加载他知道他的社交ID,但我不知道该怎么做。
我已经看到UserManager的方法$ this-> findUserBy找到了一个关于属性的用户,但我认为情况并非如此。
我该怎么做才能找到一个好的解决方案?
提前致谢。
祝你好运, 的Izzy。
答案 0 :(得分:2)
要实现这一目标,你需要深入了解教义的api。基础存储库方法(find,findBy等......)是不够的。
您需要使用doctrine's DQL。它看起来像SQL,但您根据映射元数据进行查询,而不是直接基于数据库模式进行查询。
如果您的用户对OneToMany
有$socialAccounts
SocialEngine
个属性。您将能够执行以下操作:
SELECT u
FROM Bundle:User AS u
JOIN u.socialAccounts AS sa
WHERE sa.id = 34
但是您只能查询SocialEngine的属性,而不能查询子类的属性...(即:您无法查询SocialFacebookEngine的facebookId
)。
您必须将所有twitter / facebook / etc数据放在SocialEngine
类的基础User
类中。
或者您可以为每个“社交引擎”创建一个实体,并在每个引擎和用户之间创建一个OneToOne关系关系。