错误:如果不选择至少一个根实体别名,则无法通过标识变量选择实体


Error: Cannot select entity through identification variables without choosing at least one root entity alias

我正在我的存储库中使用此查询构建器:

public function findByCityCategory($city, $category)
{
    $qb = $this->createQueryBuilder('e')
        ->select(['e.id','e.title','e.address', 'e.lat', 'e.lng', 'e.siteUrl', 'e.phoneNo', 'w', 'd.id as category', 'avg(r.rating) as rating'])
        ->innerJoin('e.workingTimes', 'w')
        ->innerJoin('e.category', 'd')
        ->where('d.id = :categoryId')
        ->andWhere('e.city = :cityId')
        ->leftJoin('e.ratings', 'r')
        ->groupBy('r.place')
        ->setParameter('categoryId', $category)
        ->setParameter('cityId', $city);
    return $qb->getQuery()->getResult();
}

但是当我尝试执行它时,我得到: "message": "[Semantical Error] line 0, col -1 near 'SELECT e.id,': Error: Cannot select entity through identification variables without choosing at least one root entity alias.", "class": "Doctrine''ORM''Query''QueryException",

在这里和这里寻找类似的问题,但这些都不适合我。我的实体如下所示:

<?php
namespace AppBundle'Entity;
use Doctrine'Common'Collections'ArrayCollection;
use Doctrine'ORM'Mapping as ORM;
use Symfony'Component'Validator'Constraints as Assert;
/** 
 * Place
 *
 * @ORM'Table(name="place")
 * @ORM'Entity(repositoryClass="AppBundle'Repository'PlaceRepository")
 */
class Place
{
/**
 * @var int
 *
 * @ORM'Column(name="id", type="integer")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="AUTO")
 */
private $id;
/**
 * @var string
 * @Assert'NotBlank()
 * @ORM'Column(name="title", type="string", length=255)
 */
private $title;
/**
 * @var string
 * @Assert'NotBlank()
 * @ORM'Column(name="address", type="string", length=255)
 */
private $address;
/**
 * @var float
 * @Assert'NotBlank()
 * @ORM'Column(name="lat", type="float")
 */
private $lat;
/**
 * @var float
 * @Assert'NotBlank()
 * @ORM'Column(name="lng", type="float")
 */
private $lng;
/**
 * @var string
 *
 * @ORM'Column(name="description", type="text", nullable=true)
 */
private $description;
/**
 * @var string
 *
 * @ORM'Column(name="fb_page", type="string", length=255, nullable=true)
 */
private $fbPage;
/**
 * @Assert'NotBlank()
 * @ORM'ManyToOne(targetEntity="City")
 * @ORM'JoinColumn(name="city_id", referencedColumnName="id")
 */
private $city;
/**
 * @Assert'NotBlank()
 * @ORM'ManyToOne(targetEntity="Category", inversedBy="places")
 * @ORM'JoinColumn(name="category_id", referencedColumnName="id")
 */
private $category;
/**
 * @var string
 *
 * @ORM'Column(name="site_url", type="string", length=255, nullable=true)
 */
private $siteUrl;
/**
 * @ORM'ManyToMany(targetEntity="WorkingTime", cascade={"persist"})
 * @ORM'JoinTable(name="places_workingtimes",
 *      joinColumns={@ORM'JoinColumn(name="place_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM'JoinColumn(name="workingtime_id", referencedColumnName="id", unique=true)}
 *      )
 */
private $workingTimes;
/**
 * @var string
 * @ORM'Column(name="phone_no", type="string", length=255, nullable=true)
 *
 */
private $phoneNo;
/**
 * @ORM'OneToMany(targetEntity="Rating", mappedBy="place")
 */
private $ratings;

}`

namespace AppBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
 /**
 * Rating
 *
 * @ORM'Table(name="rating")
 * @ORM'Entity(repositoryClass="AppBundle'Repository'RatingRepository")
 */
class Rating
{
/**
 * @var int
 *
 * @ORM'Column(name="id", type="integer")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="AUTO")
 */
private $id;
/**
 * @var int
 *
 * @ORM'Column(name="rating", type="smallint")
 */
private $rating;
/**
 * @ORM'ManyToOne(targetEntity="Place", inversedBy="ratings")
 * @ORM'JoinColumn(name="place_id", referencedColumnName="id")
 */
private $place;
/**
 * @ORM'ManyToOne(targetEntity="User")
 * @ORM'JoinColumn(name="user_id", referencedColumnName="id")
 */
private $user;

此错误仅在我尝试选择"w"时发生。那么,如何加入这个对象集合呢?

如果只想从实体获取部分字段,则必须使用 PARTIAL 关键字,如文档中所述:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/partial-objects.html

如果您使用 ORM 查询构建器,最好加载所有字段而不是一些字段,因为 ORM 是为处理对象而设计的。如果只需要几个字段,则最好使用本机 SQL 查询生成器。

我通过使用 JMS 序列化程序的 Exclude() 注释从 Place 实体中排除不必要的字段而不是从实体中选择必填字段来设法做到这一点。