系统
数据库
Houses --> id, name
Visits --> id, date, house_id
模型
Visit belongsTo House
House hasMany Visit
查看
问题
尝试
我以为我可以用virtualFields做但我失败了(它总是返回所有房屋的最大值)。
public $virtualFields = array('lastvisit' => 'SELECT MAX(visits.date) FROM visits, houses WHERE houses.id = visits.house_id GROUP BY house_id');
我试图在一个新的Houses表列中“缓存”每个最大访问次数,但它非常脏。
感谢您的帮助。
答案 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次访问。