如何解决使用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 举报,一经查实,本站将立刻删除。