jasny/db-mongo

此包已被废弃且不再维护。未建议替代包。

向Mongo PHP扩展添加现代OOP数据库模式

v1.3.2 2019-10-18 07:40 UTC

README

Build Status

Jasny DB Mongo 向PHP的MongoDB扩展添加OOP设计模式。

Jasny DB Mongo 不是一个数据库抽象层,它扩展了Mongo类(除了Jasny\DB\Mongo\Cursor类,它封装了MongoDB\Driver\Cursor,但仍允许透明地调用其方法)。Mongo的所有类、属性和方法都是可用的,并且将按PHP手册中所述的方式工作。

安装

使用composer安装Jasny Mongo DB。


php composer.php require jasny/db-mongo '~2.0'

用法

它可以像MongoDB扩展一样使用,有一些改进。

初始化连接

创建数据库实例时,我们可以使用第一个参数不是仅MongoDB\Driver\Manager,还可以是一个选项数组,甚至是一个uri连接字符串


$options = [
    'client' => 'mongodb://localhost:27017',
    'database' => 'test'
];

$db = new DB($options, '');

或者


$uri = 'mongodb://user:password@test-host:27017/test-db?foo=bar';
$db = new DB($uri, '');

或者数据库名称可以作为第二个参数传递,就像在MongoDB\Database中要求的那样。

保存项

您可以使用在MongoDB\Collection中定义的集合保存方法。与旧的PHP Mongo扩展不同,新的扩展中移除了save方法。我们的库在Jasny\DB\Mongo\Collection类中实现了它,因为它非常方便。

所以你可以这样做


$collection = $db->test_collection;
$document = ['foo' => 'bar'];

$collection->save($document);

之后,此$document将包含_id字段。

如果您使用其他保存方法,如replaceOneinsertOneinsertMany,id字段不会自动附加到文档上,因为我们需要遵循父方法声明,这不允许这样做。

要将创建的id分配给文档,您可以这样做


$result = $collection->insertOne($document);
$collection->useResultId($document, '_id', $result);

这在我们的一些库类中自动执行,如Jasny\DB\Mongo\DataMapperJasny\DB\Mongo\Document

从数据库获取

当使用$cursor = $collection->find($filter)获取记录时,会返回一个Jasny\DB\Mongo\Cursor实例。它不扩展MongoDB\Driver\Cursor类,因为所有MongoDB\Driver类都是最终的。相反,它封装了它,实现了所有方法的魔术调用。

因此,以下检查将不会工作


$cursor instanceof MongoDB\Driver\Cursor; // false

但您仍然可以做其他所有事情


$asArray = $cursor->asArray();

或者在游标上执行foreach迭代。

转换获取的记录

我们使用一个基类来存储数据库中的项目。这是Jasny\DB\Entity,它在Jasny DB存储库中定义。

使用集合方法 findfindOne 获取数据库记录可以生成此类(或您定义的任何子类)的记录。

为了使用这些记录,您应按照以下方式获取集合实例


$collection = $db->selectCollection('foo_collection', ['documentClass' => SomeEntity::class]);

将对象转换为 Entity 类由我们的框架执行,不使用 MongoDBtypeMap 功能,因为转换可能相当复杂。

以下情况中


$record = $collection->findOne($filter);

$recordJasny\DB\Entity 的一个实例。

以下情况中


$cursor = $collection->find($filter);

要获取转换后的记录,您可以使用 foreach 遍历 $cursor,或者使用我们的框架实现的 $cursor->toArrayCast() 方法。如果您使用原生 $cursor->toArray() 方法(由 MongoDB\Driver\Cursor 实现),记录将使用集合 typeMap 选项中定义的转换。默认情况下,我们将此选项设置为使用数组转换。