Symfony Doctrine 的findBy和map方法是什么?

3

我想使用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关系


你需要使用查询构建器。请参考https://dev59.com/Omw05IYBdhLWcg3whCNn - redbirdo
2个回答

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();

我更喜欢你的答案,但是我无法让它工作... 对我来说,它似乎与 wh.user 有问题,因为它崩溃了,显示 QueryException: [Semantical Error] line 0, col 19 near 'user FROM AppBundle\Entity\WorkHour': Error: Invalid PathExpression. Must be a StateFieldPathExpression.。完整查询:QueryException: SELECT DISTINCT wh.user FROM AppBundle\Entity\WorkHour wh(我已经注释掉了项目部分以进行调试)。 - Jonas Felber
@JonasFelber 抱歉,我的代码有误 - 我只是在写代码,而不是尝试运行它 :) 我已经编辑了答案,我相信它应该可以工作。 - MikO

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接