基本上我想用doctrine:
执行这个mysql查询select distinct user_id from work_hour where project_id = ?;
但我不知道如何用漂亮的Doctrine代码来做到这一点。是否可以使它看起来像下面的伪代码或我是否必须使用查询构建器?:
$project = new Project();
...
$entities = $em->getRepository('AppBundle:WorkHour')
->findByProject($project)->selectUser()->distinct();
其中$ entities是User对象的数组
WorkHour和Project具有ManyToOne关系
WorkHour和User具有ManyToOne关系
答案 0 :(得分:3)
你需要使用QueryBuilder
,但这仍然是一个“漂亮的Doctrine代码”,看起来仍然像你的伪代码。 />
这样的事情应该有效:
$queryBuilder = $em->createQueryBuilder();
$query = queryBuilder
->select('u')
->distinct()
->from('AppBundle:User', 'u')
->join('AppBundle:WorkHour', 'wh')
->where('u.workHour = wh')
->andWhere('wh.project = :project')
->getQuery();
$query->setParameter(':project', $project);
$entities = $query->getResult();
答案 1 :(得分:2)
public function findByProject($project)
{
$qb = $this->getEntityManager()->createQueryBuilder('User');
$qb
->select('User')
->from('Path\Bundle\Entity\User', 'User')
->join('Path\Bundle\Entity\WorkHour', 'wh',
'WITH', 'User.workHour = wh')
->where('wh.project = :project'))
->distinct()
->setParameter('project', $project)
;
$query = $qb->getQuery();
return $query->getResult();
}
如果您有一个复杂的查询,您应该在QueryBuilder中执行它,它会更有效。
http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html
如果你有复杂的查询,你不应该直接进入控制器,它不应该知道这个逻辑,你必须在存储库中进行并从那里调用它