微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Doctrine ODM订购嵌入式文档

如何解决使用Doctrine ODM订购嵌入式文档

我要订购嵌入的文档。

该字段看起来像这样

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

图像EmbeddedDocument

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

更新了索引

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

解决方法

索引不以任何方式用于订购文档,它们告诉数据库对数据进行索引,以便可以高效地对其进行搜索。在Doctrine的ORM中有一个@OrderBy批注,但可悲的是它尚未进入ODM(尚未)。解决方案要么是在ODM本身中支持此类功能,要么可以为嵌入式文档使用自定义集合。

在这里您将找到custom collections的文档,这是指向我的软件包的链接,该软件包旨在启动您自己的实现: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 = [];

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。