0

我正在尝试做一个查询生成器,但我不知道如何开始,因为查询有点复杂。

SQL中的查询是这样的:

SELECT email FROM AdminUsers WHERE id = (
    SELECT u_id FROM user_groups WHERE group_id = 'id_from_group_table'
);

我正在查询 3 个表,因为我有一个表用户、表组和第三个表,其中包含它们之间的关系,每行都有 user_id 和 group_id。

如何使用查询生成器或 DQL 实现这一目标?

非常感谢!

4

2 回答 2

0

你是如何建立你的实体的?您必须在 User 实体和 Group 实体上使用 ManyToMany 关系。比你可以查询这些实体相对容易

用户实体

/**
 * @var Group
 *
 * @ORM\ManyToMany(targetEntity="Group", mappedBy="users")
 * @ORM\JoinTable(name="user_group",
 *   joinColumns={
 *     @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="group_id", referencedColumnName="id")
 *   }
 * )
 */
private $groups;

集团实体

/**
 * @var User
 *
 * @ORM\ManyToMany(targetEntity="User", inversedBy="groups")
 */
private $users;

不要忘记在构造函数中初始化 $users 和 $groups var

public function __construct
{
     $this->groups = new ArrayCollection();
}

现在您可以查询这些实体

在控制器中

$this->getDoctrine()->getRepository('YourBundle:User')->FindByGroup($yourGroupId);

或者如果你想使用 QueryBuilder

$q = $this->getDoctrine()->getRepository('YourBundle:User')
     ->createQueryBuilder('user')
     ->select('user.email')
     ->innerJoin('user.group', 'group')
     ->where('group.id = ?1')
     ->setParameter(1, $yourGroupId)

和文档:http ://docs.doctrine-project.org/en/latest/reference/query-builder.html

于 2013-11-13T10:33:28.070 回答
0

类似的东西应该可以工作(未经实际测试)

$query = $em->createQuery('SELECT u.email FROM AdminUsers u WHERE EXISTS (SELECT g.u_id FROM user_groups g WHERE g.group_id = ?1 AND u.id = g.u_id)')->setParameter(1, 321); //where 321 the id you are looking for

$emails = $query->getResult();

文档:http ://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html 更多文档:http ://docs.doctrine-project.org/en/2.1/reference/ dql-doctrine-query-language.html

关于子查询的小教程: http ://www.philipphoffmann.de/blog/2012/08/29/a-bulletproof-pattern-for-creating-doctrine-subqueries-of-any-complexity/

编辑 注意查询正文中的“?1”和​​末尾的“setParameter()”方法,这是您应该将参数传递给任何查询的方式,无论是使用查询构建器还是 DQL 甚至 SQL 构建都无关紧要。始终这样做,因为它可以保护您免受 SQL 注入!

于 2013-11-13T10:36:29.967 回答