Ian*_*ery 17 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;
....
}
Run Code Online (Sandbox Code Playgroud)
而我正在尝试做的是运行一个查询来返回所有"x"类别的所有项目 - 我认为/认为应该是SELECT with和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();
}
Run Code Online (Sandbox Code Playgroud)
这一小段代码没有错误并吐出以下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
Run Code Online (Sandbox Code Playgroud)
这总是返回一个空数组,即没有结果.尽管在我的数据库中,有超过20个符合标准的项目:属于这两个类别.
有谁看到我在这里做错了什么?这应该是AND选择......?基本上我只想知道如何查询Doctrine 2+中的多对多关系,其中必须满足多个值...
Ian*_*ery 41
对于任何有兴趣的人,我都明白了(痛苦地).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.
Run Code Online (Sandbox Code Playgroud)
这将返回所有要求的类别中的所有项目.
| 归档时间: |
|
| 查看次数: |
11874 次 |
| 最近记录: |