【问题标题】:Symfony Doctrine findBy and then mapSymfony Doctrine findBy 然后映射
【发布时间】:2015-06-11 10:11:17
【问题描述】:

基本上我想用学说执行这个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 是一个用户对象数组

WorkHour 和 Project 具有 ManyToOne 关系

WorkHour 和 User 具有 ManyToOne 关系

【问题讨论】:

标签: php symfony doctrine-orm doctrine


【解决方案1】:

您需要为此使用 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(我将项目部分注释掉以进行调试)
  • @JonasFelber 抱歉,我在代码中出错了 - 我没有尝试代码,只是编写它:) 我编辑了答案,我很确定它应该可以工作
【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多