lorenzo / linkable
CakePHP Linkable 行为
Requires
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 的方法