jasny / db-mongo
向Mongo PHP扩展添加现代OOP数据库模式
Requires
- php: >=7.0
- ext-mongodb: ^1.4.0
- doctrine/inflector: ^1.0
- jasny/db: ^2.4.5
- mongodb/mongodb: ^1.3
Requires (Dev)
- phpunit/phpunit: 5.*
README
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
字段。
如果您使用其他保存方法,如replaceOne
、insertOne
或insertMany
,id字段不会自动附加到文档上,因为我们需要遵循父方法声明,这不允许这样做。
要将创建的id分配给文档,您可以这样做
$result = $collection->insertOne($document);
$collection->useResultId($document, '_id', $result);
这在我们的一些库类中自动执行,如Jasny\DB\Mongo\DataMapper
或Jasny\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存储库中定义。
使用集合方法 find
和 findOne
获取数据库记录可以生成此类(或您定义的任何子类)的记录。
为了使用这些记录,您应按照以下方式获取集合实例
$collection = $db->selectCollection('foo_collection', ['documentClass' => SomeEntity::class]);
将对象转换为 Entity
类由我们的框架执行,不使用 MongoDB
的 typeMap
功能,因为转换可能相当复杂。
以下情况中
$record = $collection->findOne($filter);
$record
是 Jasny\DB\Entity
的一个实例。
以下情况中
$cursor = $collection->find($filter);
要获取转换后的记录,您可以使用 foreach
遍历 $cursor
,或者使用我们的框架实现的 $cursor->toArrayCast()
方法。如果您使用原生 $cursor->toArray()
方法(由 MongoDB\Driver\Cursor
实现),记录将使用集合 typeMap
选项中定义的转换。默认情况下,我们将此选项设置为使用数组转换。