Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cakephp缓存关联结果_Php_Mysql_Cakephp_Caching_Model - Fatal编程技术网

Cakephp缓存关联结果

Cakephp缓存关联结果,php,mysql,cakephp,caching,model,Php,Mysql,Cakephp,Caching,Model,我使用cachephp的find查询大块数据。我使用递归2。(遗憾的是,我真的需要这么多递归。)我想缓存关联的结果,但我不知道在哪里返回它们。例如,我有一张卡片桌,卡片属于艺术家。当我从卡片查询某些内容时,find方法在卡片表中运行,但不在艺术家表中运行,但我得到了卡片的艺术家id字段的艺术家值,我在查询日志中看到如下查询: `Artist`.`id`, `Artist`.`name` FROM `swords`.`artists` AS `Artist` WHERE `Artist`.`id`

我使用cachephp的find查询大块数据。我使用递归2。(遗憾的是,我真的需要这么多递归。)我想缓存关联的结果,但我不知道在哪里返回它们。例如,我有一张卡片桌,卡片属于艺术家。当我从卡片查询某些内容时,find方法在卡片表中运行,但不在艺术家表中运行,但我得到了卡片的艺术家id字段的艺术家值,我在查询日志中看到如下查询:

`Artist`.`id`, `Artist`.`name` FROM `swords`.`artists` AS `Artist` WHERE `Artist`.`id` = 93
我的问题是如何缓存这种类型的查询


谢谢

编写查询结果,如下所示

Cache::write("cache_name",$result);
当您想要从缓存中检索数据时,请像

$results = Cache::read("cache_name");

编写查询结果,如下所示

Cache::write("cache_name",$result);
当您想要从缓存中检索数据时,请像

$results = Cache::read("cache_name");
1.蛋糕在哪里“做”这个? CakePHP确实很酷,但正如您自己所发现的那样,在其不同的
DataSource::read()
方法实现中,有时操作会非常昂贵。例如,在Dbo数据源中。如您所见,在Cake确定
$recursive
选项的值并决定查询您的关联时,您没有直接的“hook”(=回调)。但是我们有
之前
之后
回调

2.在哪里缓存关联的数据? 我认为,这样的操作最适合于
Model
类的
beforeFind
afterFind
回调方法,或者与
Model.beforeFind
Model.afterFind
事件监听器连接到模型事件管理器的等效方法

一般的想法是在
beforeFind
方法中检查缓存。如果缓存了一些数据,
$recursive
选项更改为较低的值(例如-1、0或1),然后执行正常查询。在
afterFind
方法中,将缓存的数据与从数据库中新获取的数据合并

请注意,
beforeFind
仅在实际从中获取数据的模型上调用,而
afterFind
也在每个关联模型上调用,因此,
$primary
参数

3.举个例子?
//我们在一个模型中。
受保护的$cacheKey;
公共函数beforeFind($query){
if(isset($query[“recursive”])&&$query[“recursive”]==2){
$this->cacheKey=generate\u my\u unique\u query\u cache\u key($query);//Todo
if(Cache::read($this->cacheKey)!==false){
$query[“recursive”]=0;//1,-1。。。
返回$query;
}
}
返回父项::beforeFind($query);
}
公共函数afterFind($results,$primary=false){
如果($primary&&$this->cacheKey){
if(($cachedData=Cache::read($this->cacheKey))!==false){
$results=array\u merge($results$cachedData);
//可能使用Hash::merge()而不是array\u merge
//或者完全不同的东西。
}否则{
$数据=。。。;
//在此处从$results中提取数据,
//Hash::extract()是你的朋友!
//但如果您没有任何线索,请使用debug($results:)
Cache::write($this->cacheKey,$data);
}
$this->cacheKey=null;
}
返回父项::afterFind($results,$primary);
}
4.还有什么? 如果您在使用
$recursion
的深度/高值时遇到问题,请查看Cake的。这允许您过滤最深的递归

另一个技巧是:有时这种深度递归可能是总体设计不好或次优的标志(数据库模式、总体软件体系结构、应用程序的流程和功能流,等等)。也许有更简单的方法来达到你想要的结果?

1。蛋糕在哪里“做”这个? CakePHP确实很酷,但正如您自己所发现的那样,在其不同的
DataSource::read()
方法实现中,有时操作会非常昂贵。例如,在Dbo数据源中。如您所见,在Cake确定
$recursive
选项的值并决定查询您的关联时,您没有直接的“hook”(=回调)。但是我们有
之前
之后
回调

2.在哪里缓存关联的数据? 我认为,这样的操作最适合于
Model
类的
beforeFind
afterFind
回调方法,或者与
Model.beforeFind
Model.afterFind
事件监听器连接到模型事件管理器的等效方法

一般的想法是在
beforeFind
方法中检查缓存。如果缓存了一些数据,
$recursive
选项更改为较低的值(例如-1、0或1),然后执行正常查询。在
afterFind
方法中,将缓存的数据与从数据库中新获取的数据合并

请注意,
beforeFind
仅在实际从中获取数据的模型上调用,而
afterFind
也在每个关联模型上调用,因此,
$primary
参数

3.举个例子?
//我们在一个模型中。
受保护的$cacheKey;
公共函数beforeFind($query){
if(isset($query[“recursive”])&&$query[“recursive”]==2){
$this->cacheKey=generate\u my\u unique\u query\u cache\u key($query);//Todo
if(Cache::read($this->cacheKey)!==false){
$query[“recursive”]=0;//1,-1。。。
返回$query;
}
}
返回父项::beforeFind($query);
}
公共函数afterFind($results,$primary=false){
如果($primary&&$this->cacheKey){
if(($cachedData=Cache::read($this->cacheKey))!==false){
$results=array\u merge($results$cachedData);
//可能使用Hash::merge()而不是array\u merge
//或者完全不同的东西。
}