etubaro / cakephp-eager-loader
CakePHP 2.x 插件,用于实现预加载
0.4.2
2023-03-27 21:10 UTC
Requires
- composer/installers: ^1.0.23
This package is auto-updated.
Last update: 2024-09-28 00:49:43 UTC
README
CakePHP 2.x 的 EagerLoader 插件
一个针对 CakePHP 2.x 的预加载行为插件,与 Containable 行为 兼容性极高,但生成的查询更好。
需求
- CakePHP 2.x
- PHP 5.3+
安装
有关一般性帮助,请参阅 CakePHP 文档中的 如何安装插件。
- 将
EagerLoader
目录放入您的插件目录或从您的 composer.json 文件所在的目录使用 Composer 安装插件
php composer.phar require etubaro/cakephp-eager-loader
- 在您的 app/Config/bootstrap.php 文件中加载插件
CakePlugin::load('EagerLoader');
- 并在您的模型或 app/Model/AppModel.php 中 启用行为
class Post extends AppModel { public $actsAs = array('EagerLoader.EagerLoader'); }
用法
$Comment->find('first', [ 'contain' => [ 'Article.User.Profile', 'User.Profile', ] ]);
EagerLoaderBehavior
与 ContainableBehavior
兼容性很高,但生成的查询更好。在上面的示例中,只需执行以下 2 个查询
SELECT Comment.id, ... FROM comments AS Comment LEFT JOIN articles AS Article ON (Comment.article_id = Article.id) LEFT JOIN users AS User ON (Article.user_id = User.id) LEFT JOIN profiles AS Profile ON (User.id = Profile.user_id) WHERE 1 = 1
SELECT User.id, ... FROM users AS User LEFT JOIN profiles AS Profile ON (User.id = Profile.user_id) WHERE User.id IN (1, 2, 3)
如果使用 ContainableBehavior
,会执行多少个查询?10 个或更多?
不兼容性问题
EagerLoaderBehavior
返回的结果几乎与 ContainableBehavior
相同,但您可能会遇到这两个行为之间的不兼容问题。例如,尚未实现 EagerLoaderBehavior::contain()
。
然后可以动态地禁用 EagerLoaderBehavior
,使用 ContainableBehavior::contain()
代替
$Comment->Behaviors->disable('EagerLoader'); $Comment->Behaviors->load('Containable'); $Comment->contain('Article'); $result = $Comment->find('first');
为了您的信息,EagerLoaderBehavior
可以与 ContainableBehavior
共存。
$actsAs = [ 'EagerLoader.EagerLoader', // Requires higher priority than Containable 'Containable' ]
使用这种方式,在上面的示例中,您不需要调用 load('Containable')