【问题标题】:Implementing a friends list in Symfony2.1 with Doctrine使用 Doctrine 在 Symfony2.1 中实现好友列表
【发布时间】:2013-01-23 01:51:11
【问题描述】:

我想在Symfony2.1Doctrine.中实现特定用户的好友列表 让我们说朋友表:

User1 User2 Status     //0-pending request,1-accepted
A     B      0
A     C      1
D     A      1
E     A      1

现在我想在列表中获取A 的朋友姓名。对于这个SQL 查询,可以使用UNION 来实现,正如在许多其他答案中所读的那样。但我想在doctrine query builder. 中实现这一点 一种选择是分别查询两列并将结果和排序结合起来。但这需要更多时间来执行并获得结果。我想尽快得到快速响应。有什么方法可以查询吗?

【问题讨论】:

  • 这并不是实现好友列表的最佳方式,因为您的“好友”对象将有一个方向(这将导致您稍后在查询中编写大量条件)。考虑实现 Friendship User 关联,每个友谊恰好有 2 个用户(在应用程序级别受到限制)
  • 没错! @JeanValjean 已经提到过。但我想保持请求未决或已接受等状态。所以我实现了这种方式

标签: symfony doctrine-orm symfony-2.1


【解决方案1】:

您不需要任何额外的努力,例如通过使用 Doctrine Query Builder!

只需将实体类User 设计为具有many-to-many self-reference with User,例如:

 * @ORM\Table()
 * @ORM\Entity()
 */
class User
{
....

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", unique=true, length=255)
     * 
     */
    private $name;

    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="myFriends")
     **/
    private $friendsWithMe;

    /**
     * @ORM\ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
     * @ORM\JoinTable(name="friends",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="friend_user_id", referencedColumnName="id")}
     *      )
     **/
    private $myFriends;

    public function __construct() {
        $this->friendsWithMe = new \Doctrine\Common\Collections\ArrayCollection();
        $this->myFriends = new \Doctrine\Common\Collections\ArrayCollection();
    }

}

那么就可以简单的获取User实体,获取所有好友如下:

$user = $this->getDoctrine()
                ->getRepository('AcmeUserBundle:User')
                ->findOneById($anUserId);
$friends = $user->getMyFriends();
$names = array();
foreach($friends as $friend) $names[] = $friend->getName();

【讨论】:

  • 实际上,我为朋友创建了单独的表,因为我想存储未决请求、已接受等状态。因此,我必须解决这个问题。有什么想法来实现吗?
  • 如果有多种状态类型,您必须定义单独的表,并且您不能在 Friedlist 表中插入该标志。因此,您应该避免创建额外的表。还要考虑在映射我提供的多对多关联时,学说会自动创建一个像你这样的表。
  • 这个例子对我来说似乎仍然是错误的。您正在混合必须分开的概念!一件事是朋友列表,您可以从中获得朋友的名字。请按照我的建议实现此功能。另一件事是带有(临时)数据的表:这个表名应该是“邀请”而不是“好友列表”。邀请具有以下列:sender(用户类型)、receiver(用户类型)、status(布尔类型),以及其他附加字段,例如发送日期。通过这种方式,您可以获得更高效的实现,并保证两个不同的业务逻辑之间的分离!
  • 初步说明:您可以随时更改。回答你的问题,是的,方法不止一种。但是,要回答您的问题,您必须解释一个人何时是另一个人的朋友。 UserA 列中的用户是 UserB 列中用户的朋友,例如 status=1,反之亦然?换句话说,我需要知道表格是否必须双向阅读!
  • 一个 Doctrine 查询应该类似于以下 DQL 查询:“SELECT DISTINCT l.friend FROM AcmeBundlenameBundle:FriendList l JOIN l.usera a JOIN l.userb b WHERE l.status=1 AND (a .id = $id OR b.id=$id")"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
相关资源
最近更新 更多