我有一个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.
我几乎可以肯定它是因为选择部分包含"。"。
答案 0 :(得分:0)
好的,您有一个错误“必须是状态字段表达式”,因为正如您所说的选择中有一个点,您选择根变量'f'的成员。
但是在你的情况下,我认为你的映射是错误的,这就是你编写查询时遇到困难的原因。 我认为你不应该有一个友谊课,以及一些ManyToOne协会。 但只有User类中的ManyToMany关联具有自引用
这里来自官方文件:
我引用:
您甚至可以自我引用多对多关联。一个 常见的情况是用户有朋友和目标实体 该关系是用户,因此它是自引用的。在这 例如,它是双向的,因此用户有一个名为$ 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());