教义加入多对多没有关联

Posted

技术标签:

【中文标题】教义加入多对多没有关联【英文标题】:Doctrine Join Many To Many without association 【发布时间】:2015-07-15 19:07:33 【问题描述】:

我有:两个具有非定向 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 关联拆分为双向

附:这个问题没有重复,我检查好了。

【问题讨论】:

你找到解决这个问题的方法了吗? @semsem 我不记得说实话了。但现在我将使用与中间表的 MtM 关系。见***.com/questions/15616157/… 看来单向关联没有解决方案。 【参考方案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()));

【讨论】:

以上是关于教义加入多对多没有关联的主要内容,如果未能解决你的问题,请参考以下文章

教义中的多对多关系

教义 - 以表为目标的多对多

教义 - 在多对多关系表中插入记录

教义2多对多带翻译

教义2多对多自我引用与中间细节

从教义中的多对多自引用实体中获取孩子