Symfony2 - Doctrine DQL - 多对多查询

时间:2016-12-20 09:49:46

标签: symfony doctrine-orm doctrine many-to-many dql

我有实体OfferArea,其中一个Offer可以有多个Areas,一个Area属于许多Offers:< / p>

Offer实体:

/**
 * @ORM\ManyToMany(targetEntity="Area")
 * @ORM\JoinTable(name="relationship_offer_areas",
 *      joinColumns={@ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="CASCADE")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="area_id", referencedColumnName="id")}
 *      )
 */
private $areas;

现在我试图通过Offers使用DQL(而非查询构建器)获取Area

$query = 'SELECT o FROM IndexBundle:Offer o '.
    'LEFT JOIN IndexBundle:Area a '.
    'WHERE a = :area '.
    'ORDER BY o.startDate ASC';

此处:areaArea实体对象。不幸的是,它没有按预期工作。我得到了所有区域的所有报价行。

任何想法我错过了什么?在查询语言中使用实体真的扭曲了我的想法。谢谢!

1 个答案:

答案 0 :(得分:2)

$query = 'SELECT o FROM IndexBundle:Offer o '.
'LEFT JOIN o.areas a '.
'WHERE a.id = :areaId '.
'ORDER BY o.startDate ASC';

它不知道如何动态使用JOIN。使用实体的属性进行加入。它就像你在SQL中执行LEFT JOIN一样,因为你引用了一个你想要附加数据的列。正如您在联接的ON中指定的那样。

  

使用DQL进行左连接 - 请参阅文档:Doctrine DQL - Select examples

$query = $em->createQuery('SELECT u.id, a.id as article_id FROM CmsUser u LEFT JOIN u.articles a');
$results = $query->getResult(); // array of user ids and every article_id for each user