[英]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.