【问题标题】:Find the right DQL找到合适的 DQL
【发布时间】:2021-01-13 07:54:30
【问题描述】:

我在 DQL(和 SQL !)方面有一些困难。我总是写简单的查询,但现在我需要更具体的东西,但我不知道该怎么做。

我在 OneToMany 中有一个实体用户,我的实体 Program 在 OneToMany 中,我的实体 Exercice 在 OneToMany 中,我的代表。

我想知道特定用户的所有代表都已完成。 最好的方法是什么?

【问题讨论】:

    标签: symfony dql


    【解决方案1】:
            $this->createQueryBuilder('user')
            ->select('rep')
            ->join('user.programs', 'program')
            ->join('program.exercices', 'exercice')
            ->join('exercice.reps', 'rep')
            ->getQuery()
            ->getResult();
    

    说明:

    此代码必须在您的存储库中。用户存储库一。

            $this->createQueryBuilder('user')
            is equivalent to
            $this->_em->createQueryBuilder()
            ->select('user')
            ->from('user')
    

    你可以用第二行覆盖选择:

                ->select('rep')
    

    然后按照您的问题中的描述进行连接。

    programs 必须是您在用户中定义的实体属性才能加入程序 练习和代表也是如此。它们对应关系的反面。

    join() 函数中的第二个参数是别名。它可以是你想要的任何东西。您在 select 和下一个 join() 中使用别名

    【讨论】:

    • 我刚刚完全按照你说的做了,但我遇到了这个错误:[Semantical Error] line 0, col -1 near 'SELECT rep FROM': Error: Cannot select entity through identification variables without choosing at least one root entity alias.
    • 这意味着您没有从用户存储库中调用它。尝试第二个: $this->_em->createQueryBuilder() ->select('rep') ->from('user')->....
    • 我在我的 UserRepository 中创建了一个 findAllRepsByUser($user) 并且我按照你的建议进行了尝试,但它没有用。即使使用第二个,我也会收到错误
    • 好的,我找到了。而不是->select('rep') 我使用->select('rep.number') 谢谢帮助
    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2014-07-06
    相关资源
    最近更新 更多