CakePHP 2.x - 虚拟字段最大foreach项目

时间:2013-02-16 13:11:08

标签: php cakephp field cakephp-2.2 paginator

系统

  • CakePHP 2.x

数据库

Houses --> id, name
Visits --> id, date, house_id

模型

Visit belongsTo House
House hasMany Visit

查看

  • 我看到所有名为houses / index.ctp。
  • 的房屋
  • 它列出了每个房屋的身份和姓名。
  • 我还使用PaginatorHelper对我的数组进行排序。

问题

  • 我想看看他们上次访问的每个房子。
  • 这必须由PaginatorHelper
  • 排序

尝试

  • 我以为我可以用virtualFields做但我失败了(它总是返回所有房屋的最大值)。

    public $virtualFields = array('lastvisit' => 'SELECT MAX(visits.date) FROM visits, houses WHERE houses.id = visits.house_id GROUP BY house_id');

  • 我试图在一个新的Houses表列中“缓存”每个最大访问次数,但它非常脏。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

为此声明虚拟字段可能会非常棘手,因此我建议您在需要时随时添加虚拟字段。

因此,您的HousesController索引操作将如下所示:

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_visit,以使其更加美化。

希望它有所帮助。

答案 1 :(得分:0)

如果您使用Containable行为,这非常简单。

  $this->paginate['House'] = array(
    'contain' => array('Visit' => array('order' => 'date DESC')
  );
  $houses = $this->paginate('House');

我还没有对此进行测试,但它应该非常接近您的需求。您可能希望为contain添加限制,因此您只能看到最后的x次访问。