brandonwestcott / li3_embedded
Lithium PHP mongo嵌入式关系
Requires
- php: >=5.3
- joseym/li3_installer: master
This package is not auto-updated.
Last update: 2024-09-28 12:41:25 UTC
README
目前处于早期阶段,仅支持读取操作。希望这个插件不会用得太久,因为li3计划在核心中支持嵌入式关系。
一个插件,用于为MongoDb添加对li3嵌入式关系的支持。Lithium的mongo适配器声称它支持嵌入式关系,但在经过大量调查后发现并非如此。基本上,当指定嵌入式关系时,它会对父级执行单次查询,并在返回数据时创建由父级返回的数据的相应模型。
安装
使用Composer
修改你的项目的composer.json
文件
{ "require": { ... "brandonwestcott/li3_embedded": "master" ... } }
运行./composer.phar install
,这将把该库安装到你的应用/libraries目录中
或者,只需克隆、下载或作为子模块
- 将插件克隆/下载/作为子模块到你的应用的
libraries
目录。 - 通过在应用
config/bootstrap/libraries.php
中添加以下内容来告诉你的应用加载插件
用法
在config/bootstrap/libraries.php
文件中添加插件
<?php Libraries::add('li3_embedded'); ?>
接下来,在你的应用/config/connections.php中指定这个扩展的MongoDB适配器。
Connections::add('default', array( 'type' => 'MongoDb', 'adapter' => 'MongoEmbedded', 'host' => 'localhost', 'database' => 'foo' ));
使用嵌入式关系
继续按照Lithium指定的方式定义关系,如此处所述,除了嵌入式键
class Team extends \lithium\data\Model.php { public $hasMany = array( 'Players' => array( 'to' => 'Players', 'embedded' => 'players' ), 'Scouts' => array( 'to' => 'Scouts', 'embedded' => 'miscellaneous.offseason.scouts', 'fieldName' => 'scouts', ), );
指定的键是用于在查找查询中引用关系的名称。
选项包括
to - 指定的目标模型
embedded - 数据嵌入的键
fieldName - 相关模型附加到的键(在上面的示例中,嵌套的scouts DocumentSet将被嵌入到$team->scouts中)
调用关系
关系调用方式如Lithium指定,如此处所述
Team::find('first', array( '_id' => 1, 'with' => array( 'Players', ), ));
这将返回一个团队文档。在团队中存在玩家,这将是一个玩家模型的实例。(正在讨论是否将引用放在魔法方法中还是属性中 - 欢迎任何反馈,即 ->players())
hasOne将被设置为文档。
hasMany将被设置为DocumentSet。
然而,当没有返回数据时,行为略有不同。空的hasOne将返回null,这与调用Model::find('first')的行为一致。空的hasMany将继续返回一个空的DocumentSet,这与调用Model::find('all')的行为一致。
一些注意事项
- 测试版 测试版 测试版 - 目前,该插件在一个读取MongoDB的环境中大量使用。但是,写入可能会严重破坏你的数据库。请谨慎使用。
未来计划
希望这个插件不会有一个漫长的未来。这是一个快速解决方案,允许我们不修改核心li3。我希望将这项工作移至核心的一个分支,并在那里贡献。