Symfony Doctrine findBy然后映射

时间:2015-06-11 10:11:18

标签: php symfony doctrine-orm doctrine

基本上我想用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关系

2 个答案:

答案 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

如果你有复杂的查询,你不应该直接进入控制器,它不应该知道这个逻辑,你必须在存储库中进行并从那里调用它