formapro / yadm
最快的 MongoDB 对象文档映射器。
0.5.5
2019-05-14 10:38 UTC
Requires
- php: ^7.1
- formapro/values: ^0.5.1
- mikemccabe/json-patch-php: dev-master
- mongodb/mongodb: ^1
Requires (Dev)
- phpunit/phpunit: ~6.0
README
无模式 ODM。它提供了最快的 hydrate 和持久化。基于 formapro/values 库。
安装
$ composer require formapro/yadm "mikemccabe/json-patch-php:dev-master as 0.1.1"
存储示例
假设我们有一个订单模型
<?php namespace Acme; use function Formapro\Values\set_value; use function Formapro\Values\get_value; class Price { private $values = []; public function setCurrency(string $value): void { set_value($this, 'currency', $value); } public function getCurrency(): string { return get_value($this, 'currency'); } public function setAmount(int $value): void { set_value($this, 'amount', $value); } public function getAmount(): string { return get_value($this, 'amount'); } }
<?php namespace Acme; use function Formapro\Values\set_value; use function Formapro\Values\get_value; use function Formapro\Values\set_object; use function Formapro\Values\get_object; class Order { private $values = []; public function setNumber(string $number): void { set_value($this, 'number', $number); } public function getNumber(): string { return get_value($this, 'number'); } public function setPrice(Price $price): void { set_object($this, 'price', $price); } public function getPrice(): Price { return get_object($this, 'price', Price::class); } }
<?php namespace Acme; use MongoDB\Client; use Formapro\Yadm\Hydrator; use Formapro\Yadm\Storage; $collection = (new Client())->selectCollection('acme_demo', 'orders'); $hydrator = new Hydrator(Order::class); $storage = new Storage($collection, $hydrator); $price = new Price(); $price->setAmount(123); # 1.23 USD $price->setCurrency('USD'); $order = new Order(); $order->setNumber(1234); $order->setPrice($price); $storage->insert($order); $foundOrder = $storage->find(['_id' => get_object_id($order)]); $foundOrder->setNumber(4321); $storage->update($foundOrder); $storage->delete($foundOrder);
MongoDB 特殊类型的使用
<?php namespace Acme; use MongoDB\Client; use Formapro\Yadm\Hydrator; use Formapro\Yadm\Storage; use Formapro\Yadm\ConvertValues; use Formapro\Yadm\Type\UuidType; use Formapro\Yadm\Type\UTCDatetimeType; use Formapro\Yadm\Uuid; use function Formapro\Values\set_value; use function Formapro\Values\get_value; $convertValues = new ConvertValues([ 'id' => new UuidType(), 'createdAt' => new UTCDatetimeType(), ]); $collection = (new Client())->selectCollection('acme_demo', 'orders'); $hydrator = new Hydrator(Order::class); $storage = new Storage($collection, $hydrator, null, null, $convertValues); $order = new Order(); set_value($order, 'id', Uuid::generate()->toString()); set_value($order, 'createdAt', (new \DateTime())->format('U')); $storage->insert($order); $id = get_value($order, 'id'); // find by uuid $anotherOrder = $storage->findOne(['id' => new Uuid($id)]); // do not update id if not changed $storage->update($anotherOrder); // update on change set_value($anotherOrder, 'id', Uuid::generate()->toString()); $storage->update($anotherOrder);
其他示例
在 formapro/values 仓库中,您可以找到如何构建简单对象、对象树、从对象中 hydrate 和检索数据的示例。
基准测试
许可证
MIT