查询doctrine2中复合实体中包含的实体

时间:2015-05-26 15:36:50

标签: symfony doctrine-orm

我有一个Friendship类,其中包含$user$friend。我想为用户获取所有朋友的列表。我不确定如何创建查询构建器来执行此操作。

这是我的yml。

Acme\Project\Domain\User\Entity\Friendship:
    type: entity
    table: friendships
    id:
        user:
            associationKey: true

        friend:
            associationKey: true
    fields:
        createdAt:
            type: datetimetz
            column: created_at
    manyToOne:
        user:
            targetEntity: Acme\Project\Domain\User\Entity\User
            joinColumn:
                name: user_id
                referencedColumnName: id
                onDelete: CASCADE
        friend:
            targetEntity: Acme\Project\Domain\User\Entity\User
            joinColumn:
                name: friend_id
                referencedColumnName: id
                onDelete: CASCADE

我试过这个

    $qb->select('f.friend')
        ->from(Friendship::CLASS, 'f')
        ->where('IDENTITY(f.user) = :user_id')
        ->setParameter('user_id', $user->getId());

但是得到以下错误。

[Semantical Error] line 0, col 9 near 'friend FROM Acme\\Project\\Domain\\User\\Entity\\Friendship': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

我几乎可以肯定它是因为选择部分包含"。"。

1 个答案:

答案 0 :(得分:0)

好的,您有一个错误“必须是状态字段表达式”,因为正如您所说的选择中有一个点,您选择根变量'f'的成员。

但是在你的情况下,我认为你的映射是错误的,这就是你编写查询时遇到困难的原因。 我认为你不应该有一个友谊课,以及一些ManyToOne协会。 但只有User类中的ManyToMany关联具有自引用

这里来自官方文件:

many-to-many-self-referencing

我引用:

  

您甚至可以自我引用多对多关联。一个   常见的情况是用户有朋友和目标实体   该关系是用户,因此它是自引用的。在这   例如,它是双向的,因此用户有一个名为$ friendsWithMe的字段   和$ myFriends。

您必须将带有注释的以下映射转换为在您的情况下使用yml进行映射:

<?php
/** @Entity **/
class User
{
    // ...

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

    /**
     * @ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
     * @JoinTable(name="friends",
     *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@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();
    }

    // ...
}

查询:

$qb->select('u')
    ->from(User::CLASS, 'u')
    ->join('u.friendsWithMe', 'friendWithMe')
    ->where('IDENTITY(friendWithMe) = :user_id')
    ->setParameter('user_id', $user->getId());