brandonwestcott/li3_embedded

Lithium PHP mongo嵌入式关系

dev-master 2012-10-12 16:05 UTC

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目录中

或者,只需克隆、下载或作为子模块

  1. 将插件克隆/下载/作为子模块到你的应用的libraries目录。
  2. 通过在应用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')的行为一致。

一些注意事项

  1. 测试版 测试版 测试版 - 目前,该插件在一个读取MongoDB的环境中大量使用。但是,写入可能会严重破坏你的数据库。请谨慎使用。

未来计划

希望这个插件不会有一个漫长的未来。这是一个快速解决方案,允许我们不修改核心li3。我希望将这项工作移至核心的一个分支,并在那里贡献。