Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
Caching CakePHP 3-由完整SQL语句键入的缓存查询_Caching_Cakephp_Parameters_Orm_Cakephp 3.0 - Fatal编程技术网

Caching CakePHP 3-由完整SQL语句键入的缓存查询

Caching CakePHP 3-由完整SQL语句键入的缓存查询,caching,cakephp,parameters,orm,cakephp-3.0,Caching,Cakephp,Parameters,Orm,Cakephp 3.0,我尝试使用缓存添加到一个特别慢的查询中 此查询具有固定的选定字段和限制,但三个组件在不同的用户之间可能有所不同:表本身上的where语句、on对联接表进行筛选,以及on对第二个联接表进行筛选。 所以我过滤主表和两个连接表上的数据 为了使缓存工作,我需要将过滤条件合并到缓存键中为此,我如何提取所有查找筛选器(包括连接上的筛选器)? 如果我使用$q->子句('where'),就像在链接的建议中一样,我只在主表上获得过滤器,而不是联接。而$q->子句('join')为空 $query = $this-

我尝试使用缓存添加到一个特别慢的查询中

此查询具有固定的选定字段和限制,但三个组件在不同的用户之间可能有所不同:表本身上的
where
语句、
on
对联接表进行筛选,以及
on
对第二个联接表进行筛选。
所以我过滤主表和两个连接表上的数据

为了使缓存工作,我需要将过滤条件合并到缓存键中为此,我如何提取所有查找筛选器(包括连接上的筛选器)?

如果我使用
$q->子句('where')
,就像在链接的建议中一样,我只在主表上获得过滤器,而不是联接。而
$q->子句('join')
为空

$query = $this->Regions->find('veryComplicatedFinder')
    ->cache(function (\Cake\ORM\Query $q)
            {
                debug($q->clause('where'));
                return 'test123';
            }, 'queries');
我想我可以使用整个SQL语句。但是,
$q->sql()
会产生如下结果:

'选择。。。从区域区域内部连接链 (Chains.id位于(:c0,:c1,:c2)和Chains.id=(Regions.chain_id))左侧 在(stores.type in(:c388)和stores.type in)上加入存储 (:c389)和Regions.id=(Stores.region_id))在上左键加入销售 Stores.id=(Sales.store_id)其中(Regions.shape)&& ST_Makeevelope(51.5,5,52,5.54326))按地区分组。id限制2000'

似乎没有包括绑定参数。

容器的连接是延迟构建的 如果
join
子句为空,那么您可能正在使用容器,即
contain()
*joinWith()
matching()
,和/或
notMatching()
方法

只有在编译查询时,才会将容器的联接添加到查询对象的
join
子句中,直到它们位于急切加载程序中,查询生成器回调尚未计算。因此,虽然您可以像这样获得它们:

$sql = $query->sql();
$bindings = $query->getValueBinder()->bindings();
//contain()
$contain=$query->GetGuardLoader()->getContain();
//*joinWith()/matching()/notMatching()
$matching=$query->getquengeloader()->getMatching();
这些条件还没有应用到任何地方

获取绑定 也就是说,如果您想评估整个查询,那么可以通过值绑定器访问绑定值,如下所示:

$sql = $query->sql();
$bindings = $query->getValueBinder()->bindings();
在finder中构建缓存密钥

一种可能需要考虑的方法是将缓存密钥责任部分地转移到查找器中,即在您的查找器中建立缓存密钥,在那里您拥有所有需要的信息,并将其设置在查询对象上以在其他地方进行评估/使用。 它可能看起来像这样:

$sql = $query->sql();
$bindings = $query->getValueBinder()->bindings();
公共函数findVerydFinder(\Cake\ORM\Query$Query)
{
$cacheKey='';
如果($abc){
$cacheKey.='abc';
$query->leftJoinWith('Abc',函数(){
// ...
});
}
如果($xyz){
$cacheKey.='xyz';
$query->innerJoinWith('Xyz',函数(){
// ...
});
}
// ...
$query->applyOptions([
'veryComplicatedFinderCacheKey'=>$cacheKey
]);
返回$query;
}
在主查询对象的
cache()
回调中,您可以读取该选项并使用它构建最终的缓存键,如下所示:

$query=$this->Regions
->查找('veryComplicatedFinder')
->缓存(
函数(\Cake\ORM\Query$Query){
$options=$query->getOptions();
$cacheKey=
“MainQueryCacheBasedonwhateyourquire”。
$options['verycomplexedFinderCacheKey'];
返回$cacheKey;
},
“查询”
);
容器的连接是延迟构建的 如果
join
子句为空,那么您可能正在使用容器,即
contain()
*joinWith()
matching()
,和/或
notMatching()
方法

只有在编译查询时,才会将容器的联接添加到查询对象的
join
子句中,直到它们位于急切加载程序中,查询生成器回调尚未计算。因此,虽然您可以像这样获得它们:

$sql = $query->sql();
$bindings = $query->getValueBinder()->bindings();
//contain()
$contain=$query->GetGuardLoader()->getContain();
//*joinWith()/matching()/notMatching()
$matching=$query->getquengeloader()->getMatching();
这些条件还没有应用到任何地方

获取绑定 也就是说,如果您想评估整个查询,那么可以通过值绑定器访问绑定值,如下所示:

$sql = $query->sql();
$bindings = $query->getValueBinder()->bindings();
在finder中构建缓存密钥

一种可能需要考虑的方法是将缓存密钥责任部分地转移到查找器中,即在您的查找器中建立缓存密钥,在那里您拥有所有需要的信息,并将其设置在查询对象上以在其他地方进行评估/使用。 它可能看起来像这样:

$sql = $query->sql();
$bindings = $query->getValueBinder()->bindings();
公共函数findVerydFinder(\Cake\ORM\Query$Query)
{
$cacheKey='';
如果($abc){
$cacheKey.='abc';
$query->leftJoinWith('Abc',函数(){
// ...
});
}
如果($xyz){
$cacheKey.='xyz';
$query->innerJoinWith('Xyz',函数(){
// ...
});
}
// ...
$query->applyOptions([
'veryComplicatedFinderCacheKey'=>$cacheKey
]);
返回$query;
}
在主查询对象的
cache()
回调中,您可以读取该选项并使用它构建最终的缓存键,如下所示:

$query=$this->Regions
->查找('veryComplicatedFinder')
->缓存(
函数(\Cake\ORM\Query$Query){
$options=$query->getOptions();
$cacheKey=
“MainQueryCacheBasedonwhateyourquire”。
$options['verycomplexedFinderCacheKey'];
返回$cacheKey;
},
“克利