php - Doctrine 2 : Cannot select entity through identification variables without choosing at least one root entity alias

标签 php mysql symfony doctrine-orm doctrine

我被一个原本非常简单的 doctrine 2 查询所困。我有一个名为 Category 的实体,它与自身具有 OneToMany 关系(对于父类别和子类别)。

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
 */
private $parent;

/**
 * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
 */
private $children;

下面的查询

$q = $this->createQueryBuilder('c')
            ->leftJoin('c.children', 'cc')
            ->select('c.name as title, cc')
            ->where('c.parent IS NULL');

因错误而失败

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

我真的不明白这个问题。如果我省略了 ->select 部分,查询确实有效并给出了预期的结果。我已经搜索了论坛,但找不到有效的解决方案。有人有建议吗?非常感谢。

最佳答案

您的问题是您试图从类别实体中选择一个字段,同时选择已连接类别实体的整个对象。与普通 SQL 不同,使用 QueryBuilder 组件,您不能仅从要加入的表中选择实体。

如果您希望返回包含已连接子项的主类别对象,您可以执行 ->select(array('c', 'cc')),或者简单地省略 ->select() 一起调用。前者将在单个查询中自动选择您需要的 child 。如果您想访问主要类别实体上的子项,后者将需要另一个 SQL 查询。

如果您出于某种原因希望 name 在您的对象中选择为 title,您始终可以向您的实体添加另一个函数,该函数是检索名称的别名而不是必须在您的查询中编写它:

function getTitle()
{
    return $this->getName();
}

关于php - Doctrine 2 : Cannot select entity through identification variables without choosing at least one root entity alias,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34513052/

相关文章:

php mysqli 没有返回值

PHP复制和删除文件并从数据库中删除记录

php - 更改 PHP 备份目录

php - Composer 更新花费很多时间

php - 无法在 symfony2 控制台命令中保留对象

php - 获取两个数组中存在的相同键值对的数量

php - 将 Proxygen 或 NGINX + FastCGI 本地套接字与 HHVM 一起使用性能更好吗?

php - 日期时间时区mysql和php计算

MySQL : Problem in Updating a column for condition

symfony - 使用 Assetic 有条件地加载资源