首页 > 解决方案 > 使用 Doctrine ODM 订购嵌入式文档

问题描述

我正在尝试订购我的嵌入文档。

该字段看起来像这样

/**
 * @ODM\EmbedMany(targetDocument=Image::class, strategy="set")
 * @ODM\Index(keys={"order"="asc"})
 * @Groups({"offer:read"})
 */
protected $images = [];

图像嵌入文档

namespace App\Document\Embedded;

use App\Document\Traits\NameableTrait;
use App\Document\Traits\OrderableTrait;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
 * @ODM\EmbeddedDocument
 */
class Image
{
    use NameableTrait;
    use OrderableTrait;
    …
}

和可订购的特征

namespace App\Document\Traits;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Symfony\Component\Serializer\Annotation\Groups;

trait OrderableTrait
{
    /**
     * @ODM\Field(type="int")
     * @Groups({"offer:read"})
     *
     * @var int|null
     */
    private $order;

    public function getOrder(): int
    {
        return $this->order;
    }

    public function setOrder(int $order): void
    {
        $this->order = $order;
    }
}

我更新了索引bin/console doctrine:mongodb:schema:update

但是我的图像没有被订购。索引是这样做的吗?

标签: mongodbsymfonydoctrinedoctrine-odm

解决方案


索引不用于以任何方式对文档进行排序,它们告诉数据库对数据进行索引,以便可以有效地搜索它。在 Doctrine 的 ORM 中有一个@OrderBy注释,但遗憾的是它还没有进入 ODM(还)。解决方案是在 ODM 本身中原生支持此类事情,或者您可以为嵌入的文档使用自定义集合。

在这里,您将找到自定义集合的文档,这里是我的包的链接,旨在启动您自己的实现:https ://github.com/malarzm/collections 。为了得到你需要的东西,你需要你自己的集合类,看起来像这样:

class SortableCollection extends Malarzm\Collections\SortedCollection
{
    public function compare($a, $b)
    {
        return $a->getOrder() <=> $b->getOrder();
    }
}

然后将其插入您的映射中:

/**
 * @ODM\EmbedMany(targetDocument=Image::class, strategy="set", customCollection=SortableCollection::class)
 * @ODM\Index(keys={"order"="asc"})
 * @Groups({"offer:read"})
 */
protected $images = [];

推荐阅读