Symfony/Doctrine错误:“未定义类‘FROM’。”在getResult()上

Symfony/Doctrine错误:“未定义类‘FROM’。”在getResult()上,symfony,doctrine,doctrine-query,symfony-3.2,Symfony,Doctrine,Doctrine Query,Symfony 3.2,我正在开发我的第一个symfony应用程序,在尝试使用queryBuilder时,我已经为一个问题挣扎了几个小时 我正在尝试执行SQL查询,出现以下错误: request.CRITICAL:Uncaught PHP异常原则\ORM\Query\QueryException:[语义错误]第0行,第288列“FROM StatsBundle\Entity\PlayerRealMatch”附近:错误:未定义类“FROM” 基本上,我存储的是足球运动员的得分和目标,现在我想用总和和平均值来检索这些数据的

我正在开发我的第一个symfony应用程序,在尝试使用queryBuilder时,我已经为一个问题挣扎了几个小时

我正在尝试执行SQL查询,出现以下错误:

request.CRITICAL:Uncaught PHP异常原则\ORM\Query\QueryException:[语义错误]第0行,第288列“FROM StatsBundle\Entity\PlayerRealMatch”附近:错误:未定义类“FROM”

基本上,我存储的是足球运动员的得分和目标,现在我想用总和和平均值来检索这些数据的集合

我在一个服务中,在我的PlayerRealMatchRepository中调用一个方法,该方法的核心代码如下:

        $qb = $this->createQueryBuilder('prm');
        $qb->select(
            "SUM(prm.has_started) as tit,
            SUM(prm.has_entered) as rempl,
            SUM(prm.yellow_cards) as yc,
            SUM(prm.red_card) as rc,
            SUM(prm.goals) AS gf,
            SUM(prm.own_goals) as ga,
            AVG(prm.rating) as avg"
        )
            ->innerJoin('prm.realMatch', 'rm')
            ->where('prm.playerId = :idPlayer')
            ->groupBy('rm.season')
            ->setParameter('idPlayer', $player->getId())
            ->getQuery();
        $query =$qb->getQuery();
        $seasonData = $query->getResult();
如果我使用调试器查看$query对象的_dql属性,下面是我得到的:

SELECT SUM(prm.has_started) as tit,
                SUM(prm.has_entered) as rempl,
                SUM(prm.yellow_cards) as yc,
                SUM(prm.red_card) as rc,
                SUM(prm.goals) AS gf,
                SUM(prm.own_goals) as ga,
                AVG(prm.rating) as avg 
FROM StatsBundle\Entity\PlayerRealMatch prm 
INNER JOIN prm.realMatch rm 
WHERE prm.playerId = :idPlayer 
GROUP BY rm.season
我觉得没那么糟,你们知道这里出了什么问题吗

注意:下面是我试图实现的一个查询示例,它可以完美地直接在我的数据库上运行:

SELECT SUM(prm.has_started) as tit,
                SUM(prm.has_entered) as rempl,
                SUM(prm.yellow_cards) as yc,
                SUM(prm.red_card) as rc,
                SUM(prm.goals) AS gf,
                SUM(prm.own_goals) as ga,
                AVG(prm.rating) as avg 
FROM player_real_match prm 
INNER JOIN real_match rm ON prm.real_match_id = rm.id 
WHERE prm.player_id = 327 
GROUP BY rm.season;
详情如下

3个实体:

游戏者 RealMatch:有关匹配的常规数据 PlayerRealMatch:球员在比赛中的表现 下面是它们各自配置的摘要,以显示它们是如何链接的

StatsBundle\Entity\Player: 
...
    manyToOne:
        real_team:
            targetEntity: RealTeam
            inversedBy: players
            joinColumn:
                onDelete: CASCADE
                name: real_team_id
                referencedColumnName: id
    oneToMany:
        player_real_matches:
            targetEntity: PlayerRealMatch
            mappedBy: player 
...
从服务调用存储库方法

    foreach ($players as $player) {
        $this->aggregatePlayerData($player, $match);
    }

    private function aggregatePlayerData(Player $player, RealMatch $match)
    {
        $playerStats = $this->_em
            ->getRepository('StatsBundle:PlayerRealMatch')
            ->getAggregatedStats($player, $match);
    }

public function __construct(EntityManager $entityManager)
{
    $this->_em = $entityManager;
}
这是服务。yml关于我的服务

stats.aggregator:
    class: StatsBundle\Service\Aggregator
    arguments: [ "@doctrine.orm.entity_manager"]
存储库方法

 /**
 * getAggregatedStats
 *
 * @param $player the player entity
 * @param RealMatch $match  the real match entity
 *
 * @return array
 */
public function getAggregatedStats($player, RealMatch $match)
{

    $qb = $this->createQueryBuilder('prm');
    $qb->select(
        "SUM(prm.has_started) as tit,
        SUM(prm.has_entered) as rempl,
        SUM(prm.yellow_cards) as yc,
        SUM(prm.red_card) as rc,
        SUM(prm.goals) AS gf,
        SUM(prm.own_goals) as ga,
        AVG(prm.rating) as avg"
    )
    ->from('StatsBundle:PlayerRealMatch', 'prm')
    ->innerJoin('prm.realMatch', 'rm')
    ->where('prm.playerId = :idPlayer')
    ->groupBy('rm.season')
    ->setParameter('idPlayer', $player->getId())
    ->getQuery();
    $query = $qb->getQuery();
    $seasonData = $query->getResult();

    return $seasonData;
}
很抱歉发了这么长的帖子,我尽量把它记录清楚。
非常感谢你的帮助

您在查询中没有给出from字段,请尝试这样做

$qb = $this->createQueryBuilder('prm');
    $qb->select(
        "SUM(prm.has_started) as tit,
        SUM(prm.has_entered) as rempl,
        SUM(prm.yellow_cards) as yc,
        SUM(prm.red_card) as rc,
        SUM(prm.goals) AS gf,
        SUM(prm.own_goals) as ga,
        AVG(prm.rating) as avg"
    )
        ->from('StatsBundle:PlayerRealMatch ', 'prm') // this one is missing
        ->innerJoin('prm.realMatch', 'rm')
        ->where('prm.playerId = :idPlayer')
        ->groupBy('rm.season')
        ->setParameter('idPlayer', $player->getId());

    $seasonData = $qb->getQuery()->getResult();

我终于发现了这个问题,我相信这是一个典型的初学者错误:

在select指令中,我使用小写属性,因为这是SQL列的格式

但是,我的实体属性并非如此。下面是select指令的正确语法

   "SUM(prm.hasStarted) as tit,
    SUM(prm.hasEntered) as rempl,
    SUM(prm.yellowCards) as yc,
    SUM(prm.redCard) as rc,
    SUM(prm.goals) as gf,
    SUM(prm.ownGoals) as ga,
    AVG(prm.rating) as avg"
因此,结论是:在执行DQL时,始终引用实体属性,而不是DB列

虽然错误消息很奇怪,但我希望有更明确的东西,比如实体X没有属性Y


非常感谢Azam Alvi抽出您的时间。

您正在尝试使用保留sql字作为列名, 试着改变

"AVG(prm.rating) as avg" -> "AVG(prm.rating) as avgRating"

谢谢你的建议,但事实上我已经试过了,但没有成功,还是同样的错误。根据我的理解,这是通过以下方式隐式完成的:$this->createQueryBuilder'prm';因为我在PlayerRealMatchRepository上。它实际上显示在我的_dql上,你能给我看一下这个查询的完整函数代码吗。还告诉我你是如何从repo调用这个函数的代码。我用你的问题更新了原始帖子的描述为什么你要调用->getQuery函数两次?删除第一个我这样做是为了调试的目的,我想删除查询。。。刚改成$SECTIONDATA[$player->getId]=$qb->getQuery->getResult;但是当然,它不会改变任何事情我也有同样的问题,除了我使用了count。这救了我。
   "SUM(prm.hasStarted) as tit,
    SUM(prm.hasEntered) as rempl,
    SUM(prm.yellowCards) as yc,
    SUM(prm.redCard) as rc,
    SUM(prm.goals) as gf,
    SUM(prm.ownGoals) as ga,
    AVG(prm.rating) as avg"
"AVG(prm.rating) as avg" -> "AVG(prm.rating) as avgRating"