Doctrine 2.1 DQL - 多对多查询多个值 - 多个类别的项目?

时间:2012-01-21 05:45:23

标签: sql doctrine many-to-many dql

这似乎是一个基本要求,但我似乎无法让它发挥作用,所以我要么错过了一些愚蠢的东西,要么就是不明白应该怎么做。提前谢谢。

我有两个具有多对多关系的学说实体:项目和类别。其中有items_has_categories加入。

/**
* Item
*
* @Table(name="items")
* @Entity(repositoryClass="Entity\Repository\Item")
*/
class Item
{

....

 /**
 * @var Categories
 *
 * @ManyToMany(targetEntity="Categorie", inversedBy="items", cascade={"persist"})
 * @JoinTable(name="items_has_categories",
 *   joinColumns={
 *     @JoinColumn(name="items_id", referencedColumnName="id")
 *   },
 *   inverseJoinColumns={
 *     @JoinColumn(name="categories_id", referencedColumnName="id")
 *   }
 * )
 */
private $categories;

....
}

/**
* Categorie
*
* @Table(name="categories")
* @Entity(repositoryClass="Entity\Repository\Categorie")
*/
class Categorie
{
 .....

/**
 * @var Items
 *
 * @ManyToMany(targetEntity="Item", mappedBy="categories")
 */
private $items;

....
}

我正在尝试做的是运行一个查询来返回所有“x”类别中的所有项目 - 我认为/它应该是SELECT with AND AND子句:

class Item extends EntityRepository
{
    public function findItemsByCategories($categories)
    {

    $qString = 'SELECT j, t, c FROM Technique\Entity\Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE';

    $i = 0;
    foreach ($categories as $c)
    {
        $qString .= ' c.name = ?' . $i;

        if ($i < (count($categories)-1))
        {
            $qString .= ' AND';
        }
        $i++;
    }

    $query = $this->_em->createQuery($qString);
    $query->setParameters($categories);

    return $query->getResult();
}

这一小段代码没有错误并且吐出以下DQL SELECT查询(当数组中发送了2个类别时:$ categories):

SELECT j, t, c FROM Technique\Entity\Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE c.name = ?0 AND c.name = ?1

这总是返回一个空数组,即没有结果。即使在我的数据库中,有超过20个符合标准的项目:两种类别。

任何人都能看到我在这里做错了什么?这应该是AND选择......?基本上我只想知道如何在Doctrine 2+中查询多对多关系,其中必须满足多个值......

1 个答案:

答案 0 :(得分:40)

对于任何有兴趣的人,我都明白了(痛苦地)。 Doctrine应该更好地解释这个,而不是他们在DQL页面上的那一行....

基本上它不是AND查询,它是一个成员和查询。对于每个类别,必须创建MEMBER OF,然后使用AND:

将其添加到整个查询中
SELECT j, t FROM Entity\Item j LEFT JOIN j.itemImages t WHERE ?0 MEMBER OF j.categories AND ?1 MEMBER OF j.categories AND ?2 MEMBER OF j.categories, etc.

这将返回所有要求的类别中的所有项目。