Php 信条不经联想而多对多地结合在一起
我有:两个具有无向M:M关联的实体Php 信条不经联想而多对多地结合在一起,php,symfony,join,doctrine-orm,many-to-many,Php,Symfony,Join,Doctrine Orm,Many To Many,我有:两个具有无向M:M关联的实体 class ShareInfo { // ... /** * @ORM\ManyToMany(targetEntity="Item") * @ORM\JoinTable(name="share_info_items", * joinColumns={@ORM\JoinColumn(name="share_id", referencedColumnName="id")}, * inve
class ShareInfo
{
// ...
/**
* @ORM\ManyToMany(targetEntity="Item")
* @ORM\JoinTable(name="share_info_items",
* joinColumns={@ORM\JoinColumn(name="share_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")})
*
* @var Item[]
*/
private $items;
}
class Item
{
// ...
// This entity has no association with ShareInfo,
// because M:M is undirectional and defined in ShareInfo entity
}
我想要什么:
从items表(Item实体)中选择数据,其中Item和ShareInfo之间至少存在一条M:M记录
我的建议无效(我有一个语义错误):
$queryBuilder
->select('i')
->from(Item::class, 'i')
->innerJoin(ShareInfo::class, 'shareInfo', 'WITH', 'shareInfo.items = i');
在纯SQL中,我会这样做:
SELECT i.*
FROM items i
INNER JOIN share_info_items shareInfo
ON shareInfo.item_id = i.id
真不敢相信没有DQL的模拟。我能想象的唯一解决方案是将无方向的M:M关联拆分为双向关联
另外,这个问题没有重复,我检查得很好。实现这一点的方法是通过子查询:
$em=$this->getDoctrine()->getManager();
$queryBuilder1=$em->createQueryBuilder();
$queryBuilder1->select(array('DISTINCT i.id'))
->from('AppBundle:ShareInfo', 'share_info')
->innerJoin('share_info.items', 'i');
$queryBuilder=$em->createQueryBuilder();
$queryBuilder->select('i')
->from('AppBundle:items', 'i')
->where($queryBuilder->expr()
->in('i.id',$queryBuilder1->getDql()));
你找到解决这个问题的办法了吗?@semsem我不记得说实话了。但是现在我要使用一个MtM关系和一个中间表。请参见,似乎没有单向关联的解决方案。