Doctrine - [Semantical Error] - Error: Class has no field or association
Doctrine - [Semantical Error] - Error: Class has no field or association
我正在尝试 运行 在存储库中使用 Doctrine 的 DQL 进行查询,但出现以下错误:
QueryException in QueryException.php line 63:
[Semantical Error] line 0, col 100 near 'test_suite_id': Error: Class Application\Model\Entity\Page has no field or association named test_suite_id
协会
一个User
可以有多个TestSuite
。一个 TestSuite
可以有多个 Page
。结果,我在 User
和 TestSuite
以及 TestSuite
和 Page
之间分别有一个 One-To-Many 关联。
以下是我的实体,仅显示了相关关联:
用户
/**
* @ORM\Table(name="users", uniqueConstraints={@ORM\UniqueConstraint(name="unique_email", columns={"email"})})
* @ORM\Entity(repositoryClass="Application\Model\Repository\UserRepository")
*/
class User
{
/**
* @var TestSuite[]
*
* @ORM\OneToMany(targetEntity="TestSuite", mappedBy="user", cascade={"all"})
*/
private $testSuites = [];
}
测试套件
/**
* @ORM\Table(name="test_suites")
* @ORM\Entity(repositoryClass="Application\Model\Repository\TestSuiteRepository")
*/
class TestSuite
{
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User", inversedBy="testSuites")
* @ORM\JoinColumn{name="user_id", referencedColumnName="id")
*/
private $user;
/**
* @var Page[]
*
* @ORM\OneToMany(targetEntity="Page", mappedBy="testSuite", cascade={"all"})
*/
private $pages = [];
}
页数
/**
* @ORM\Table(name="pages")
* @ORM\Entity(repositoryClass="Application\Model\Repository\PageRepository")
*/
class Page
{
/**
* @var TestSuite
*
* @ORM\ManyToOne(targetEntity="TestSuite", inversedBy="pages")
* @ORM\JoinColumn(name="test_suite_id", referencedColumnName="id", nullable=false)
*/
private $testSuite;
}
存储库 DQL 查询
public function findPageForUser(User $user, $pageId)
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->add('select', 'p')
->from('Application\Model\Entity\Page', 'p')
->join('Application\Model\Entity\TestSuite', 'ts', 'WITH', 'p.test_suite_id = ts.id')
->join('Application\Model\Entity\User', 'u', 'WITH', 'ts.user_id = u.id')
->where('p.id = :pageId')
->andWhere('u = :user')
->setParameter('user', $user)
->setParameter('pageId', $pageId);
return $qb->getQuery()->getResult();
}
请注意,我在这里只传递 User
和 $pageId
。由查询本身来决定用户 通过测试套件加入 是否具有该特定页面。
如您所见,Page
实体显然有一个 test_suite_id
外键列指向 TestSuite
实体的 id
列,我的架构反映了这个。
生成的查询
SELECT p FROM Application\Model\Entity\Page p INNER JOIN Application\Model\Entity\TestSuite ts WITH p.test_suite_id = ts.id INNER JOIN Application\Model\Entity\User u WITH ts.user_id = u.id WHERE p.id = :pageId AND u = :user
其他帖子建议如下:
- 清除缓存 - 我没有启用缓存层
- 重新启动 Apache - 没有区别
- 将 "Colum" 重命名为 "Column" - 我没那么蠢
- 将 FQDN 放入
targetEntity
- 它们在同一目录中,因此不需要
我为什么会遇到这个问题,我该怎么做?
DQL 是静态类型的,DQL 语法是关于对象属性的,而不是 SQL 列。
此外,无需直接 select 关联实体:连接由 DQL 查询组件自动放置,并在结果中正确生成所需的 ON
子句 SQL.
这是一个应该有效的查询版本:
SELECT
p
FROM
Application\Model\Entity\Page p
INNER JOIN
p.testSuite AS ts
INNER JOIN
ts.user u
WHERE
p.id = :pageId
AND u = :user
由于 Application\Model\Entity\TestSuite#$user
是一个 to-one
关联,您可以通过删除一个连接条件来进一步简化查询:
SELECT
p
FROM
Application\Model\Entity\Page p
INNER JOIN
p.testSuite AS ts
WHERE
p.id = :pageId
AND ts.user = :user
上述查询中后者的关联DQL构建器代码如下:
public function findPageForUser(User $user, $pageId)
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->add('select', 'p')
->from('Application\Model\Entity\Page', 'p')
->join('Application\Model\Entity\TestSuite', 'ts')
->where('p.id = :pageId')
->andWhere('ts.user = :user')
->setParameter('user', $user)
->setParameter('pageId', $pageId);
return $qb->getQuery()
->setFetchMode("Application\Model\Entity\Page", "elements", "EAGER")
->getResult();
}
我正在尝试 运行 在存储库中使用 Doctrine 的 DQL 进行查询,但出现以下错误:
QueryException in QueryException.php line 63: [Semantical Error] line 0, col 100 near 'test_suite_id': Error: Class Application\Model\Entity\Page has no field or association named test_suite_id
协会
一个User
可以有多个TestSuite
。一个 TestSuite
可以有多个 Page
。结果,我在 User
和 TestSuite
以及 TestSuite
和 Page
之间分别有一个 One-To-Many 关联。
以下是我的实体,仅显示了相关关联:
用户
/**
* @ORM\Table(name="users", uniqueConstraints={@ORM\UniqueConstraint(name="unique_email", columns={"email"})})
* @ORM\Entity(repositoryClass="Application\Model\Repository\UserRepository")
*/
class User
{
/**
* @var TestSuite[]
*
* @ORM\OneToMany(targetEntity="TestSuite", mappedBy="user", cascade={"all"})
*/
private $testSuites = [];
}
测试套件
/**
* @ORM\Table(name="test_suites")
* @ORM\Entity(repositoryClass="Application\Model\Repository\TestSuiteRepository")
*/
class TestSuite
{
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User", inversedBy="testSuites")
* @ORM\JoinColumn{name="user_id", referencedColumnName="id")
*/
private $user;
/**
* @var Page[]
*
* @ORM\OneToMany(targetEntity="Page", mappedBy="testSuite", cascade={"all"})
*/
private $pages = [];
}
页数
/**
* @ORM\Table(name="pages")
* @ORM\Entity(repositoryClass="Application\Model\Repository\PageRepository")
*/
class Page
{
/**
* @var TestSuite
*
* @ORM\ManyToOne(targetEntity="TestSuite", inversedBy="pages")
* @ORM\JoinColumn(name="test_suite_id", referencedColumnName="id", nullable=false)
*/
private $testSuite;
}
存储库 DQL 查询
public function findPageForUser(User $user, $pageId)
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->add('select', 'p')
->from('Application\Model\Entity\Page', 'p')
->join('Application\Model\Entity\TestSuite', 'ts', 'WITH', 'p.test_suite_id = ts.id')
->join('Application\Model\Entity\User', 'u', 'WITH', 'ts.user_id = u.id')
->where('p.id = :pageId')
->andWhere('u = :user')
->setParameter('user', $user)
->setParameter('pageId', $pageId);
return $qb->getQuery()->getResult();
}
请注意,我在这里只传递 User
和 $pageId
。由查询本身来决定用户 通过测试套件加入 是否具有该特定页面。
如您所见,Page
实体显然有一个 test_suite_id
外键列指向 TestSuite
实体的 id
列,我的架构反映了这个。
生成的查询
SELECT p FROM Application\Model\Entity\Page p INNER JOIN Application\Model\Entity\TestSuite ts WITH p.test_suite_id = ts.id INNER JOIN Application\Model\Entity\User u WITH ts.user_id = u.id WHERE p.id = :pageId AND u = :user
其他帖子建议如下:
- 清除缓存 - 我没有启用缓存层
- 重新启动 Apache - 没有区别
- 将 "Colum" 重命名为 "Column" - 我没那么蠢
- 将 FQDN 放入
targetEntity
- 它们在同一目录中,因此不需要
我为什么会遇到这个问题,我该怎么做?
DQL 是静态类型的,DQL 语法是关于对象属性的,而不是 SQL 列。
此外,无需直接 select 关联实体:连接由 DQL 查询组件自动放置,并在结果中正确生成所需的 ON
子句 SQL.
这是一个应该有效的查询版本:
SELECT
p
FROM
Application\Model\Entity\Page p
INNER JOIN
p.testSuite AS ts
INNER JOIN
ts.user u
WHERE
p.id = :pageId
AND u = :user
由于 Application\Model\Entity\TestSuite#$user
是一个 to-one
关联,您可以通过删除一个连接条件来进一步简化查询:
SELECT
p
FROM
Application\Model\Entity\Page p
INNER JOIN
p.testSuite AS ts
WHERE
p.id = :pageId
AND ts.user = :user
上述查询中后者的关联DQL构建器代码如下:
public function findPageForUser(User $user, $pageId)
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->add('select', 'p')
->from('Application\Model\Entity\Page', 'p')
->join('Application\Model\Entity\TestSuite', 'ts')
->where('p.id = :pageId')
->andWhere('ts.user = :user')
->setParameter('user', $user)
->setParameter('pageId', $pageId);
return $qb->getQuery()
->setFetchMode("Application\Model\Entity\Page", "elements", "EAGER")
->getResult();
}