gpt4 book ai didi

php - Symfony 2 Doctrine ODM 引用

转载 作者:可可西里 更新时间:2023-11-01 09:45:04 25 4
gpt4 key购买 nike

所以我有以下两个文件:

壁纸

/**
* @MongoDB\Document(
* collection="wallpapers",
* repositoryClass="Application\Bundle\DefaultBundle\Repository\WallpaperRepository"
* )
*/
class Wallpaper
{
/**
* @MongoDB\Id(strategy="auto")
* @var string $id
*/
private $id;

/**
* @var ArrayCollection
*
* @MongoDB\ReferenceMany(
* targetDocument="Category"
* )
*
*
*/
private $categories;

/**
* Constructor
*/
public function __construct()
{
$this->categories = new ArrayCollection();
}
}

类别:

/**
* @MongoDB\Document(collection="categories")
*/
class Category
{

/**
* @MongoDB\Id(strategy="auto")
* @var string $id
*/
private $id;

/**
* @MongoDB\Field(type="boolean")
*
* @var bool $published
*/
private $published;
}

我需要选择所有只包含已发布类别的壁纸...我尝试了很多解决方案,都是通过谷歌搜索找到的。但仍然没有找到解决我的问题的方法......

这里是我的查询:

$wallpapers = $this->createQueryBuilder('ApplicationDefaultBundle:Wallpaper')
->field('categories.published')->equals(true)
->getQuery()
->execute()

但它不起作用:(

有什么建议吗?

最佳答案

在关系型数据库中,您可以使用 Join 来实现,但是在 mongodb 中,您可以:


在您的墙纸文档中对您引用的类别进行去规范化:

/**
* @MongoDB\EmbedMany(targetDocument="Category")
*/
private $categories;

(注意 EmbedMany)

通过这种方式,您的查询将起作用(但类别将在每个墙纸内重复)


或者做这个简单的技巧(如果类别的数量不是太多):

//Get all the ids of the published categories:
$categories = $this->createQueryBuilder('ApplicationDefaultBundle:Category')
->field('published')->equals(true)
->getQuery()
->execute()
$categoriesIds = array();
foreach($categories as $c) {
$categoriesIds[] = $c->getId();
}

//Get the wallpapers for that categories:
$wallpapers = $this->createQueryBuilder('ApplicationDefaultBundle:Wallpaper')
->field('categories.$id')->in($categories)
->getQuery()
->execute()

如果发布的类别只有 100-200 个,这个技巧就可以了。

关于php - Symfony 2 Doctrine ODM 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20074977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com