brandonwestcott/li3_mongo_embedded

Lithium PHP mongo嵌入式关系

dev-master 2013-01-07 21:26 UTC

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

  1. 将插件克隆/下载/submodule到您的应用libraries目录中。
  2. 通过向您的应用的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')的调用行为。

一些注意事项

  1. 测试版测试版测试版 - 目前,此插件在读取MongoDB环境中被大量使用。但是,写入可能会严重破坏您的数据库。请谨慎使用。
  2. 需要在Entity的$_relationships数组中移动关系

未来的计划

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