Symfony 原则一对多情况:如何轻松获取相关实体

Symfony 原则一对多情况:如何轻松获取相关实体,symfony,doctrine,relationship,findby,Symfony,Doctrine,Relationship,Findby,为了简化,定义了两个实体:用户和注释。用户可以发布多条评论,每条评论只分配一个用户,因此评论实体具有: /** * @var \Frontuser * * @ORM\ManyToOne(targetEntity="Frontuser") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="ownerUserID", referencedColumnName="id") * }) */ private $owneruserid; 然而,在行

为了简化,定义了两个实体:用户和注释。用户可以发布多条评论,每条评论只分配一个用户,因此评论实体具有:

/**
 * @var \Frontuser
 *
 * @ORM\ManyToOne(targetEntity="Frontuser")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="ownerUserID", referencedColumnName="id")
 * })
 */
private $owneruserid;
然而,在行动中:

$orm = $this->getDoctrine()->getManager();
$repo = $orm->getRepository('CompDBBundle:Comment');
$repo->findBy(array('owneruserid' => $uid);
出现错误,没有类似于
owneruserid
的字段

那么我如何获取用户的所有评论?my DB中的类似关系也会发生同样的情况-看起来您无法使用外键作为参数运行
find()
。我相信一个函数
$user->getComments()
应该由条令自动生成/识别,以便高效、快速地访问相关实体


这个例子很简单,但是如果有更多的实体以同样的方式与我的用户相关呢?我是否必须为每个实体声明存储库,并尝试通过其
owneruserid
外键获取它们?

使用原则,当您定义相关实体时,它的类型是实体类(在本例中为FrontUser)。因此,首先,您的相关实体变量名具有误导性。它应该是

private $ownerUser;
然后,为了在相关实体字段上执行findBy,必须提供实体实例,例如

$orm = $this->getDoctrine()->getManager();
$userRepo = $orm->getRepository('CompDBBundle:FrontUser');
$user = $userRepo->findById($uid);
$commentRepo = $orm->getRepository('CompDBBundle:Comment');
$userComments = $commentRepo->findByOwnerUser($user);

如果您没有或想要检索用户实体,则可以使用带有“uid”作为参数的DQL查询。

谢谢,答案很有帮助。我还从fields的名字中删除了“ID”,以符合该学说的理念。