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



Ads实体由地理信息描述:国家>地区>县Ads实体仅与County 链接。因此,按国家检索Ads将需要我们两次加入实体。

我的目标是计算给定国家/地区的广告数量。为此,我尝试了这个 DQL 查询,但没有成功:

public function getMotorsAdsCountByCountry($slug){
    $qb = $this->_em->createQueryBuilder()
            ->select("m.id, COUNT(m.id) AS cnt")
            ->from("MinnAdsBundle:MotorsAds", "m")
            ->join("m.county","county")->addSelect("county")
            ->join("county.region","region")->addSelect("region")
            ->join("region.country","country")->addSelect("country")
            ->where("country.slug=:slug")
            ->setParameter(":slug", $slug);
    return $qb->getQuery()->getSingleScalarResult();
}

我得到的错误是:

[语义错误] 第 0 行,"选择 m.id"附近的 col -1:错误:无法通过标识变量选择实体,而不选择 at至少一个根实体别名。

我什至在此链接中看到过有关相同错误的帖子,但没有成功。

我找到了解决方案:

    $qb = $this->_em->createQueryBuilder()
            ->select("COUNT(m.id) AS cnt")
            ->from("MinnAdsBundle:MotorsAds", "m")
            ->join("m.county","county")
            ->join("county.region","region")
            ->join("region.country","country")
            ->where("country.slug=:slug")
            ->setParameter(":slug", $slug);

除了修改 select() 之外,我刚刚删除了 addSelect()。

尝试更改

->select("m.id, COUNT(m.id) AS cnt")

->select("m, COUNT(m.id) AS cnt")

或将水合更改为阵列

被称为原则限制,您应该首先加入像这样的MotorAds实体

from('MinnAdsBundle','mi')->leftJoin(MotorsAds::class,'m','WITH','mi.motorsAds = m');

然后,您可以直接选择表单 马达广告参考此答案

最新更新