我有以下模型,其中包含2个表foo
和bar
以及foo_has_bar
之间的关联:
对于给定的foo.id
,我试图得到所有相应的bar.id
。
到目前为止,我已能够从foo_has_bar
检索与特定foo.id
相关的所有条目,如下所示:
$query = $em->createQuery("SELECT h FROM 'FooHasBar' h INNER JOIN h.foo f WHERE f.id = ?1");
$query->setParameter(1, $foo_id);
$results = $query->getArrayResult();
问题是$results
仅包含id
的{{1}}字段,而不包含外键foo_has_bar
和foo_id
,因此我不能实现我想要的。
有一种方法,给定一个特定的bar_id
来使用单个DQL命令检索所有相应的foo.id
吗?
答案 0 :(得分:1)
假设实体FooHasBar
分别与foo
和bar
有关系Foo
和关系Bar
,则查询非常简单:
$q = $em->createQuery(
'SELECT
b.id as bar_id, f.id as foo_id
FROM FooHasBar fb
JOIN fb.bar b
JOIN fb.foo f
WHERE f.id = :fooId'
);
$q->setParameter( 'fooId', $foo->getId() );
$results = $query->getArrayResult();
答案 1 :(得分:0)
如果实体之间的关联是双向的:
$q = $em->createQuery( 'SELECT b.id FROM Bar b JOIN b.fooHasBar x WHERE x.foo = :fooId' );
$q->setParameter( 'fooId', $foo->getId() );
$results = $query->getScalarResult();
如果实体之间的关联是单向的(这仅适用于Doctrine 2.3 +):
$q = $em->createQuery( 'SELECT b.id FROM Bar b JOIN FooHasBar x WITH x.bar = b.id WHERE x.foo = :fooId' );
$q->setParameter( 'fooId', $foo->getId() );
$results = $query->getScalarResult();