我有2个实体,例如
from setuptools import setup
...
install_requires = [...,
'mypy>=0.630; implementation_name != "PyPy"']
setup(...,
install_requires=install_requires)
和
class A
{
...
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="B")
* @ORM\JoinTable(name="a_b",
* joinColumns={@ORM\JoinColumn(name="a_id", referencedColumnName="id", onDelete="CASCADE")},
* inverseJoinColumns={@ORM\JoinColumn(name="b_id", referencedColumnName="id", onDelete="CASCADE")}
* )
*/
protected $bs;
...
/**
* @return ArrayCollection
*/
function getBs()
{
return $this->bs;
}
...
}
仅在一侧(A)上定义了多对多关系。
我想要实现的是使用Doctrine的查询构建器来获取与单个任意A实体相关的B实体的集合。
我被限制为只能使用查询生成器来执行此操作,class B
{
...
}
之类的操作是不可行的。与本地sql相同,完全可以定义双方的关系或使用存储库。
预期结果应类似于
$a->getBs()
我假设类似
[
B {},
B {},
]
会工作的。
A,这会引发错误$em = $container->get('doctrine');
$qb = $em->createQueryBuilder();
$qb->select('b')
->from(A::class, 'a')
->join('a.bs', 'b')
->where($qb->expr()->eq('a', ':entity'))
->setParameters(['entity' => 1]);
$res = $qb->getQuery()->getResult();
尝试了类似Cannot select entity through identification variables without choosing at least one root entity alias.
的操作,但该操作也会引发错误$qb->select('a.bs')
我确实有解决方案(请参见下文),但这确实很丑陋,所以我希望有人能提供更好的解决方案。
Invalid PathExpression. Must be a StateFieldPathExpression.
如果有人可以提供一些建议,我将不胜感激。
答案 0 :(得分:0)
在这种情况下,根实体为A-必须在select方法中。 您可以尝试这样的事情:
$qb = $em->createQueryBuilder();
$qb->select('a, bs')
->from(A::class, 'a')
->leftJoin('a.bs', 'bs')
->where('a.id = :id')
->setParameter('id', 1)
;
$entityA = $qb->getQuery()->getOneOrNullResult();
$entityA->getBs(); // Returns all bs from entity A with id 1