原则-在没有根实体的情况下从多对多关系中检索集合

时间:2018-11-07 13:53:54

标签: symfony doctrine query-builder

我有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.

如果有人可以提供一些建议,我将不胜感激。

1 个答案:

答案 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