brandonwestcott / li3_mongo_embedded
Lithium PHP mongo嵌入式关系
Requires
- php: >=5.3
- joseym/li3_installer: master
This package is not auto-updated.
Last update: 2024-09-28 13:40:41 UTC
README
目前处于早期阶段,仅支持读取操作。希望这个插件不会用得太久,因为li3计划在核心中支持嵌入式关系。
一个用于添加MongoDb嵌入式关系支持的li3插件。Lithium的mongo适配器声称支持嵌入式关系,但在经过核心的大量调查后,发现并非如此。基本上,当指定嵌入式关系时,它会对父级执行单个查询,当数据返回时,它会使用从父级返回的数据创建适当的模型。
安装
使用Composer
修改您的项目 composer.json 文件
{
"require": {
...
"brandonwestcott/li3_mongo_embedded": "master"
...
}
}
运行 ./composer.phar install,这将安装此库到您的应用/libraries中
或者,只需克隆、下载或submodule
- 将插件克隆/下载/submodule到您的应用
libraries目录中。 - 通过向您的应用的
config/bootstrap/libraries.php中添加以下内容来告诉应用加载插件
用法
在您的config/bootstrap/libraries.php文件中添加插件
<?php Libraries::add('li3_mongo_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中)
调用关系
关系调用方式如此处所述
Team::find('first', array( '_id' => 1, 'with' => array( 'Players', ), ));
这将返回一个Team的Document。在团队上会有球员,这些球员将是Players模型的实例。(正在考虑将引用放在魔术方法中还是属性中 - 欢迎任何反馈,即 ->players())
hasOnes将设置为Document。
hasManies将设置为DocumentSet。
然而,当没有返回数据时,行为略有不同。空的hasOne将返回null,这是Model::find('first')的调用行为。空的hasMany将继续返回一个空的DocumentSet,这是Model::find('all')的调用行为。
一些注意事项
- 测试版测试版测试版 - 目前,此插件在读取MongoDB环境中被大量使用。但是,写入可能会严重破坏您的数据库。请谨慎使用。
- 需要在Entity的$_relationships数组中移动关系
未来的计划
希望这个插件不会有一个长的未来。这是一个快速解决方案,让我们能够不修改核心li3。我希望将这项工作移入核心的分支并贡献那里。