CakePHP 2.x-虚拟字段最大foreach项
系统CakePHP 2.x-虚拟字段最大foreach项,php,cakephp,field,cakephp-2.2,paginator,Php,Cakephp,Field,Cakephp 2.2,Paginator,系统 CakePHP2.x 数据库 Houses --> id, name Visits --> id, date, house_id 型号 Visit belongsTo House House hasMany Visit 查看 我可以查看所有名为houses/index.ctp的房屋 它列出了每个房子的id和名称 我还使用PaginatorHelper对数组进行排序 问题 Houses --> id, name Visits --> id, date, h
- CakePHP2.x
Houses --> id, name
Visits --> id, date, house_id
型号
Visit belongsTo House
House hasMany Visit
查看
- 我可以查看所有名为houses/index.ctp的房屋
- 它列出了每个房子的id和名称
- 我还使用PaginatorHelper对数组进行排序
Houses --> id, name
Visits --> id, date, house_id
- 我想看看他们上次参观的每一所房子
- 这必须由PaginatorHelper进行排序
Visit belongsTo House
House hasMany Visit
- 我原以为我可以用virtualFields实现,但我失败了(它总是返回所有房屋的最大值)
public$virtualFields=array('lastvisit'=>'从访问中选择最大访问次数(visits.date),houses WHERE houses.id=visits.house_id按房屋_id分组')代码>
- 我试图将每次max访问“缓存”在Houses表的新列中,但它非常脏
感谢您的帮助。为此声明一个虚拟字段可能很棘手,因此我建议您随时添加它 因此,您的
房屋控制器的索引操作如下所示:
public function index() {
$this->House->virtualFields['last_visit'] = 'MAX(Visit.date)';
$this->paginate = array(
'House' => array(
'group' => array('house_id'),
'joins' => array(
array(
'table' => 'visits',
'alias' => 'Visit',
'type' => 'INNER',
'conditions' => array(
'House.id = Visit.house_id',
)
)
)
)
);
$this->set('houses', $this->paginate());
}
请注意,您必须从模型中删除$publicFields
声明,并且我将字段名称从lastvisit
更改为last\u visit
,以使其更简单
希望有帮助。如果您使用该行为,这非常简单
$this->paginate['House'] = array(
'contain' => array('Visit' => array('order' => 'date DESC')
);
$houses = $this->paginate('House');
我还没有测试过这个,但它应该非常接近你需要的。您可能希望为包含添加一个限制
,以便只看到最后x次访问。您所说的是什么意思,但我失败了
?有任何错误消息吗?我只是编辑了这个问题来添加我尝试过的virtualfield。嘿,看起来不错。我检查并反馈。同样,列出最后的访问是很好的,但paginator无法根据这些日期进行排序。@Starflash你说得对,我刚刚编辑了代码,现在代码更干净了,允许排序;)谢谢你@Luchomalina,这很有效!我刚刚更改了加入类型,以便能够查看所有房屋(包括没有访问)。@Luchomalina,我查看了您的编辑,但我不确定您是否正确。看看下面的例子:这很有趣,我根据正在运行的测试对其进行了编辑。我有一个用于Stackoverflow问题的沙箱:P运行您的代码会抛出此通知(不是错误,抱歉):“间接修改重载属性HousesController::$paginate无效”-也许有人应该修复面包房?嗯,这似乎是一个解决问题的有趣方法。我可以得到所有的数据,但正如@luchomalina所说的,这个功能并没有对这个列进行排序。这个功能非常有用,我不知道。谢谢