0

嗨,我和这里有同样的问题:多对多自我关系与额外字段?但我找不到答案:/我首先尝试了 ManyToOne 并在另一个站点 OneToMany ......但后来我无法使用类似的东西

    public function hasFriend(User $user)
{
    return $this->myFriends->contains($user);
}  

因为有一些这个问题:

This function is called, taking a User type $user variable and you then use the contains()      function on $this->myFriends.

$this->myFriends 是请求的 ArrayCollection(与 User 的类型如此不同),并且来自关于 contains() 的原则文档:

The comparison of two elements is strict, that means not only the value but also the type must match.

那么用额外字段解决这种多对多关系的最佳方法是什么?或者,如果我要回去设置 onetomany 和 manytoone 关系,我该如何修改 hasFriend 方法?例如检查 ID 是否在 ID 的数组集合中。

编辑:我有这张桌子......我需要的是:1.选择我的朋友......和我的追随者......检查我是否与他成为朋友。(因为他可以和我成为朋友,而我不必和他在一起......就像在推特上一样)。我可以做很多,但我需要额外的字段,例如:“查看”“他订阅我的时间”,正如您在我的桌子上看到的那样。

并进行这样的查询,然后能够在树枝中检查是否(app.user.hasFriend(follower)或类似的东西)

           $qb = $this->createQueryBuilder('r')
                  ->select('u')
                  ->innerJoin('UserBundle:User', 'u')
                  ->Where('r.friend_id=:id')
                  ->setParameter('id', $id)
                  ->orderBy('r.time', 'DESC')
                  ->setMaxResults(50);

    return $qb->getQuery()
              ->getResult();

在此处输入图像描述

4

2 回答 2

5

我试图与额外的字段建立多对多的关系,但也无法让它发挥作用......我在论坛上读到的东西(不记得在哪里)是:

如果您将数据添加到关系中,那么它就不再是关系了。这是一个新实体。

这是正确的做法。使用新字段创建新实体,如果需要,创建自定义存储库以添加所需方法。

A <--- 多对多字段 ---> B

会成为

A --一对多--> C(带有新字段)<--一对多--B

当然,C 与 A 和 B 都有 ManyToOne 关系。

我到处搜索如何做到这一点,但最后,这是正确的做法,如果添加数据,它不再是关系。

您还可以复制 contains 通常执行的操作,或尝试在自定义存储库中覆盖它,以执行您需要它执行的任何操作。

我希望这有帮助。

于 2013-03-04T15:55:51.243 回答
3

我正在添加另一个答案,因为它与我的原始答案无关。使用您发布的新信息,我将您发布的表/实体称为“关注者”。原始实体“用户”。

如果您创建以下关联会发生什么:


namespace Acme\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Acme\UserBundle\Entity\User
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class User
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="Acme\FollowerBundle\Entity\Follower", mappedBy="followeduser")
     */
    protected $followers;

    /**
     * @ORM\OneToMany(targetEntity="Acme\FollowerBundle\Entity\Follower", mappedBy="followeeuser")
     */
    protected $followees;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    public function __construct()
    {
        $this->followers = new \Doctrine\Common\Collections\ArrayCollection();
    $this->followees = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add followers
     *
     * @param Acme\FollowerBundle\Entity\Follower $follower
     */
    public function addFollower(\Acme\FollowerBundle\Entity\Follower $follower)
    {
        $this->followers[] = $follower;
    }

    /**
     * Add followees
     *
     * @param Acme\FollowerBundle\Entity\Follower $followee
     */
    public function addFollowee(\Acme\FollowerBundle\Entity\Follower $followee)
    {
        $this->followees[] = $followee;
    }    

    /**
     * Get followers
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getFollowers()
    {
        return $this->followers;
    }

    /**
     * Get followees
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getFollowees()
    {
        return $this->followees;
    }
}


namespace Acme\FollowerBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Acme\FollowerBundle\Entity\Follower
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Follower
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\User", inversedBy="followers")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $followeduser;

    /**
     * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\User", inversedBy="followees")
     * @ORM\JoinColumn(name="followee_id", referencedColumnName="id")
     */
    protected $followeeuser;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set followeduser
     *
     * @param Acme\UserBundle\Entity\User $followeduser
     */
    public function setFolloweduser(\Acme\UserBundle\Entity\User $followeduser)
    {
        $this->followeduser = $followeduser;
    }

    /**
     * Get followeduser
     *
     * @return Acme\UserBundle\Entity\User 
     */
    public function getFolloweduser()
    {
        return $this->followeduser;
    }

    /**
     * Set followeeuser
     *
     * @param Acme\UserBundle\Entity\User $followeeuser
     */
    public function setFolloweeuser(\Acme\UserBundle\Entity\User $followeeuser)
    {
        $this->followeeuser = $followeeuser;
    }

    /**
     * Get followeeuser
     *
     * @return Acme\UserBundle\Entity\User 
     */
    public function getFolloweeuser()
    {
        return $this->followeeuser;
    }
}

我不确定这是否会奏效,我真的没有太多时间来测试它,但如果没有,我认为它正在路上。我使用两个关系,因为你不需要多对多。你需要参考一个用户可以有很多关注者,一个关注者可以关注很多用户,但是由于“用户”表是同一个,我做了两个关系,它们彼此无关,他们只是引用相同的实体,但用于不同的事物。

试试这个并试验会发生什么。您应该能够执行以下操作:


$user->getFollowers();

$follower->getFollowedUser();

and you could then check if a user is being followed by a follower whose user_id equals $userThatIwantToCheck

and you could search in Followers for a Follower whose user = $user and followeduser=$possibleFriend

于 2013-03-04T21:38:17.653 回答