教义加入多对多而不关联

问题描述 投票:0回答:2

我有: 两个具有无向 M:M 关联的实体。

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 关联拆分为双向

附注这道题没有重复,我查清楚了。

php symfony join doctrine-orm many-to-many
2个回答
0
投票

聚会迟到了,但我正在处理同样的问题并找到了一个可行的解决方案:

$queryBuilder
    ->select('i')
    ->from(Item::class, 'i')
    ->from(ShareInfo::class, 'shareInfo')
    ->innerJoin('shareInfo.items', 'items')
    ->where('items.id = i.id');

-1
投票

实现这一点的方法是通过子查询:

$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()));
© www.soinside.com 2019 - 2024. All rights reserved.