Symfony Query Builder语法

时间:2013-11-13 10:15:55

标签: php sql symfony doctrine-orm

我正在尝试创建一个查询构建器,但我不知道如何启动,因为查询有点复杂。

SQL中的查询是这样的:

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

我正在查询3个表,因为我有一个表Users,表Groups和第三个表,其中包含每个行的user_id和group_id之间的关系。

如何使用Query Builder或DQL实现这一目标?

非常感谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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注入!