lorenzo/linkable

CakePHP Linkable 行为

安装次数: 42 189

依赖项: 0

建议者: 0

安全: 0

星标: 26

关注者: 6

分支: 28

开放问题: 5

类型:cakephp-plugin

1.1.1 2014-06-08 22:28 UTC

This package is auto-updated.

Last update: 2024-08-25 21:41:36 UTC


README

Linkable 行为是 CakePHP 内置 containable 行为的补充。它有助于填补 containable 没有涵盖的空白:您将能够包含与您的模型没有直接关联的关联,并生成连接所有指定模型的查询。

当您想通过 hasMany 或 hasAndBelongsToMany 关系中的条件过滤结果时,这特别有用。

原始行为由 rafaelbandeira3 在 GitHub 上创建。

基于 The MIT License 许可。文件重新分配必须保留上述版权声明。

要求

  • CakePHP 2.x
  • PHP 5.2+

安装

如果您正在使用 composer,将其添加到您的 composer.json 文件中

	{
		"extra": {
			"installer-paths": {
				"Plugin/Linkable": ["lorenzo/linkable"]
		}
	},
		"require" : {
			"lorenzo/linkable": "master"
		}
	}

否则只需将此存储库克隆到您的 app/Plugin 文件夹内

git clone git://github.com/lorenzo/linkable.git Plugin/Linkable

启用插件

您需要在 app/Config/bootstrap.php 文件中启用插件

CakePlugin::load('Linkable');

配置

要使用此行为,将其添加到您的 AppModel 中

	<?php
		class AppModel extends Model {
		
			public $actsAs = array('Containable', 'Linkable.Linkable');
		
	}

用法

以下是一个同时使用 linkable 和 containable 的示例

	<?php
	$this->TestRun->CasesRun->find('all', array(
		'link' => array(
			'User' => array('fields' => 'username'),
			'TestCase' => array('fields' => array('TestCase.automated', 'TestCase.name'),
				'TestSuite' => array('fields' => array('TestSuite.name'),
					'TestHarness' => array('fields' => array('TestHarness.name'))
					)
				)
			),
		'conditions' => array('test_run_id' => $id),
		'contain' => array(
			'Tag'
			),
		'fields' => array(
			'CasesRun.id', 'CasesRun.state', 'CasesRun.modified', 'CasesRun.comments'
			)
		));

关系

  • CasesRun 是 TestRun <-> TestCases 的 HABTM 表
  • CasesRun 属于 TestRun
  • CasesRun 属于 User
  • CasesRun 属于 TestCase
  • TestCase 属于 TestSuite
  • TestSuite 属于 TestHarness
  • CasesRun HABTM Tags

输出 SQL

	SELECT `CasesRun`.`id`, `CasesRun`.`state`, `CasesRun`.`modified`, `CasesRun`.`comments`, `User`.`username`, `TestCase`.`automated`, `TestCase`.`name`, `TestSuite`.`name`, `TestHarness`.`name` FROM `cases_runs` AS `CasesRun` LEFT JOIN `users` AS `User` ON (`User`.`id` = `CasesRun`.`user_id`) LEFT JOIN `test_cases` AS `TestCase` ON (`TestCase`.`id` = `CasesRun`.`test_case_id`) LEFT JOIN `test_suites` AS `TestSuite` ON (`TestSuite`.`id` = `TestCase`.`test_suite_id`) LEFT JOIN `test_harnesses` AS `TestHarness` ON (`TestHarness`.`id` = `TestSuite`.`test_harness_id`) WHERE `test_run_id` = 32

	SELECT `Tag`.`id`, `Tag`.`name`, `CasesRunsTag`.`id`, `CasesRunsTag`.`cases_run_id`, `CasesRunsTag`.`tag_id` FROM `tags` AS `Tag` JOIN `cases_runs_tags` AS `CasesRunsTag` ON (`CasesRunsTag`.`cases_run_id` IN (345325, 345326, 345327, 345328) AND `CasesRunsTag`.`tag_id` = `Tag`.`id`) WHERE 1 = 1

如果您尝试使用 containable 来尝试此示例,您会发现它会生成大量的查询来获取所有数据记录。Linkable 通过连接生成单个查询。

通过子模型中的记录过滤父模型

<?php
$this->Article->find('all', array(
	'contain' => array(
		'Author'
	),
	'link' => array(
		'Comment'
	),
	'conditions' => array(
		'Comment.user_id' => 1
	)
));

前面的示例将带来所有由用户 1 完成的评论文章。请注意,如果每篇文章只有一个来自用户的评论,则此查询实际上会为每个评论返回一个 Article 记录。这是因为 Linkable 会使用单个使用连接的查询。

版本 1.1.1

  • 使用内部连接进行过滤查询
  • 错误修复

版本 1.1

  • 引入了来自 Terr 的改进和测试用例。然而,此版本的 Linkable 与 Terr 的版本不兼容!

  • 如果没有指定字段,将返回该模型的所有列

  • 如果给出了自定义条件,则无需指定外键条件。Linkable 将自动包含外键关系。

  • 能够指定 Linkable 应使用的确切条件。这通常在动态连接时需要,因为当找不到特定关系时,Linkable 通常假设 belongsTo 关系,可能会生成无效的外键条件。示例

    $this->Post->find('first', array('link' => array('User' => array('conditions' => array('exactly' => 'User.last_post_id = Post.id')))))

  • Linkable 将不再破坏使用 SQL COUNT 的查询

更多示例

查看单元测试以获取更多使用 Linkable 的方法