brandonwestcott/li3_relations

Lithium PHP 模型 -> 模型关系

1.0.0 2012-11-16 16:27 UTC

This package is not auto-updated.

Last update: 2024-09-28 13:19:51 UTC


README

现在,不要过于兴奋,这还处于早期阶段,并且仅支持读取操作和hasMany或hasOne。希望将来能够添加对完整CRUD的支持。

简单来说,这是一个插件,用于为li3添加模型之间的关系支持,而无需考虑连接。这不仅支持非支持数据库的关系,如MongoDB,还允许跨连接/数据源建立关系。例如,由Solr支持的模型与由Mongo支持的模型之间的关系。如果您希望任何给定关系使用Lithium的默认关系绑定,只需在关系选项中传入default => false即可(详情见下文)。

这种模型 -> 模型支持可能永远不会直接存在于Lithium中。然而,有了Lithium提供的强大数据源,此插件变得至关重要。

安装

使用Composer

修改您的项目的 composer.json 文件

{
    "require": {
    	...
        "brandonwestcott/li3_relations": "master"
        ...
    }
}

运行 ./composer.phar install,这将安装此库到您的app/libraries目录

或者,只需克隆、下载或submodule

  1. 将插件克隆/下载/submodule到您的应用程序的libraries目录。
  2. 通过向您的应用程序的config/bootstrap/libraries.php文件中添加以下内容,让您的应用程序加载此插件

用法

在您的config/bootstrap/libraries.php文件中添加插件

<?php
	Libraries::add('li3_relations');
?>

然后在任何模型中扩展\li3_relations\extensions\data\Model.php

namespace app\models;

class AppModel extends \li3_relations\extensions\data\Model {

定义关系

关系定义方式遵循Lithium指定的方式,详情请见此处

在hasMany中

class Team extends  \li3_relations\extensions\data\Model.php {

	public $hasMany = array(
		'Players' => array(
			'to'        => 'Players',
			'key'       => array('player_ids' => '_id'),
			'fieldName' => 'players',
			'with' 		=> array(
				'Agent'
			),
 		),
		'Coaches' => array(
			'to'     => 'Coaches',
			'key'       => array('coach_ids' => '_id'),
			'fieldName' => 'coaches',
		),
	);

	public $hasOne = array(
		'HeadCoach' => array(
			'to'     => 'Coaches',
			'key'       => array('coach_ids' => '_id'),
			'fieldName' => 'head_coach',
			'conditions' => array(
				'coach_level' => 'head'
			),
		),
	);

指定键是用于在查询中引用关系的名称。

选项包括:to - 指定目标模型
fieldName - 创建关系的字段 - 默认为驼峰式名称
fields - 要传递给查询的字段
order - 要传递给查询的排序
conditions - 要传递给查询的条件
with - 关系中的关系
default - 设置为true以使用默认的Lithium关系(即对于两个MySql模型),默认为false

调用关系

关系的调用方式遵循Lithium指定的方式,详情请见此处

Team::find('first', array(
	'_id' => 1,
	'with' => array(
		'Players',
		'HeadCoach',
		'Coaches',
	),
));

在MongoDB的情况下,这将返回一个Team的Document。在团队中存在另外三个属性,球员、教练和主教练。(正在考虑将引用放在魔术方法中还是属性中 - 欢迎任何建议,即 ->players())

hasOne将根据来源设置为类型Entity(MongoDB创建Document,SQL创建Record)。

hasMany将根据来源设置为类型Set(MongoDB创建DocumentSet,SQL创建RecordSet)。

然而,当没有返回数据时,行为略有不同。空的hasOne将返回null,这与Model::find('first')的调用行为一致。空的hasMany将返回一个空的Set,这与Model::find('all')的调用行为一致。

注意,由于指定了“with”,每个球员文档都包括一个代理,因为球员关系是在Players模型中指定的。

修改关系

在某些情况下,您可能希望根据使用情况修改关系。在这些情况下,您可以调用updateRelation,find,然后resetRelations。

Team::updateRelation('hasMany', array(
	'Players' => array(
		'conditions' => array('age' => 30),
	),
));

$team = Team::find('first', array(
	'with' => array(
		'Players',
	),
));

Team::resetRelations();

在这种情况下,$team->players只会包含年龄为30岁的玩家。

一些注意事项

  1. 贝塔贝塔贝塔 - 目前,此插件正在一个读取MongoDB & Solr的生产环境中被大量使用。然而,写入操作可能会严重破坏您的数据库。请谨慎使用。
  2. 对于喜欢SQL的人来说,我尝试让插件检查当前模型和相关模型是否都来自同一源且支持关系。(即两个MySQL支持的模型将继续使用左连接进行单个查询)。我相信这个错误存在于多次将筛选器绑定到一个连接上的问题。这个错误已在master中修复,我希望在default-relations分支中也很快修复。

未来的计划

需要实现这些关系的完整CRUD(创建、读取、更新、删除)。最终我希望li3社区将此视为必需品,并将这些功能添加到核心中。

合作

请分叉并贡献!