4

尽管我将 Symfony 2.1 与 FOSUserBundle 一起使用并且一切正常,但我不知道如何解决问题。

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

这是这种情况:

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

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

为了以后能加推特、雅虎等其他网络,我觉得应该是这样。

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

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

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

提前致谢。

最好的问候,伊兹。

4

1 回答 1

2

要实现这一点,您需要更深入地了解教义的 api。基础存储库方法(find、findBy 等)还不够。

您需要使用学说的 DQL。它看起来像 SQL,但您基于映射元数据而不是直接基于数据库模式进行查询。

如果您的用户OneToMany $socialAccountsSocialEngine. 您将能够执行以下操作:

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 关系关系。

于 2012-10-14T09:22:56.033 回答