簡體   English   中英

使用 Doctrine ODM 訂購嵌入式文檔

[英]Ordering embedded documents with 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更新了索引bin/console doctrine:mongodb:schema:update

但是我的圖像沒有被訂購。 索引是這樣做的方法嗎?

索引不用於以任何方式對文檔進行排序,它們告訴數據庫對數據進行索引,以便可以有效地搜索它。 在 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 = [];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM