etubaro / cakephp-eager-loader

CakePHP 2.x 插件,用于实现预加载

安装次数: 1,375

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 5

类型:cakephp-plugin

0.4.2 2023-03-27 21:10 UTC

This package is auto-updated.

Last update: 2024-09-28 00:49:43 UTC


README

Software License Build Status Coverage Status Scrutinizer

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',
	]
]);

EagerLoaderBehaviorContainableBehavior 兼容性很高,但生成的查询更好。在上面的示例中,只需执行以下 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')