我正在尝试创建一个查询构建器,但我不知道如何启动,因为查询有点复杂。
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实现这一目标?
非常感谢!
答案 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 varpublic 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
修改强> 请注意查询正文中的“?1”和最后的“setParameter()”方法,这是您应该如何将参数传递给任何查询,如果使用“查询”构建器或DQL甚至SQL构建,则无关紧要。始终保护您免受SQL注入!