我一直忙于CakePHP框架几个月,现在我真的很喜欢它。目前我正在开发一个非常新的项目,并且完成了它应该的工作(我认为...),但是我对我写的一些代码感到不舒服。实际上,我应该优化分页条件查询,以便立即得到正确的结果(现在我通过一组Set :: extract方法调用来操作结果集。我有一个模型'网站'谁有一个与模型'SiteMeta'有很多关系。最后一张表看起来如下:id,site_id,key,value,创建。在cakePHP 1.3中找到hasMany关系的复杂查询查询1.3
在这最后一个模型中,我记录了几个值我想要存储的密钥的名称(例如alexarank,google pagerank,...),并且也是值。在给定的时间间隔,我让我的应用程序更新这个数据库,以便我可以跟踪这个值。
现在我的问题是这样的。
在各个网站(controller => Sites,action => index)的概述页面上,我想显示该网站的CURRENT网页排名。因此,我需要一个确切的SiteMeta记录,其中'created'字段最高,'key'中的值应该与'pagerank'字相匹配。我已经尝试了几个我在网上阅读的东西,但没有得到任何工作(包含,绑定模型等)。可能我做错了什么。
现在我得到这样的结果,当我做了$这个 - >分页
Array
(
[0] => Array
(
[Site] => Array
(
[id] => 1
[parent_id] => 0
[title] => test
[url] => http://www.test.com
[slug] => www_test_com
[keywords] => cpc,seo
[language_id] => 1
)
[SiteMeta] => Array
(
[0] => Array
(
[id] => 1
[site_id] => 1
[key] => pagerank
[value] => 5
[created] => 2010-08-03 00:00:00
)
[1] => Array
(
[id] => 2
[site_id] => 1
[key] => pagerank
[value] => 2
[created] => 2010-08-17 00:00:00
)
[2] => Array
(
[id] => 5
[site_id] => 1
[key] => alexa
[value] => 1900000
[created] => 2010-08-10 17:39:06
)
)
)
要获得的PageRank我只是遍历所有的网站和操纵这个数组我得到。接下来我用Set :: extract过滤结果。但这种感觉不太对劲:)
$sitesToCheck = $this->paginate($this->_searchConditions($this->params));
foreach($sitesToCheck as $site) {
$pagerank = $this->_getPageRank($site['Site']);
$alexa = $this->_getAlexa($site['Site']);
$site['Site']['pagerank'] = $pagerank;
$sites[] = $site;
}
if (isset($this->params['named']['gpr']) && $this->params['named']['gpr']) {
$rank = explode('-', $this->params['named']['gpr']);
$min = $rank[0];$max = $rank[1];
$sites = Set::extract('/Site[pagerank<=' . $max . '][pagerank>=' . $min .']', $sites);
}
$this->set(compact('sites', 'direction'));
请问你们帮我考虑一下这个解决方案吗?提前致谢。
感谢您的贡献。我尝试了这些选项(也有一些与bindmodel但不工作),但仍然无法让它工作,因为它应该是。如果我定义这个
$this->paginate = array(
'joins'=> array(
array(
'table'=>'site_metas',
'alias'=>'SiteMeta',
'type' =>'inner',
'conditions' =>array('Site.id = SiteMeta.site_id')
)
),
);
我得到重复的结果 我有3所不同的SiteMeta记录的网站,并与2个不同的记录中的网站。 paginate方法总共返回5条记录。这可能是一个简单的解决方案,但我不知道它:)
另外我试图自己写一个SQL查询,但似乎我不能使用分页魔术在这种情况下。查询我想模仿分页选项和条件如下。查询返回完全按照我想要的。
$sites = $this->Site->query('SELECT * FROM sites Site, site_metas SiteMeta WHERE SiteMeta.id = (select SiteMeta.id from site_metas SiteMeta WHERE Site.id = SiteMeta.site_id AND SiteMeta.key = \'pagerank\' order by created desc limit 0,1)');
所以你要在有结果,而不是你PAGINATE什么阵列?或者你想要产生什么SQL查询? – bancer 2010-08-18 22:22:12
感谢您的快速回复。 我正在考虑在SiteMeta索引中只有一个项目的数组,而不是示例中的3。我希望能够调用该记录的值,因此我不必循环访问数组并通过添加一些索引为pagerank或alexa来自己更改数组。 这可以实现吗? 一个更好更清洁的解决方案的建议也可以嘿嘿:) – Laurent 2010-08-19 00:05:43