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所说的,这个功能并没有对这个列进行排序。这个功能非常有用,我不知道。谢谢