【问题标题】:CakePHP 2.x - Virtual fields max foreach itemsCakePHP 2.x - 每个项目的最大虚拟字段
【发布时间】:2013-02-16 13:11:07
【问题描述】:

系统

  • CakePHP 2.x

数据库

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

模型

Visit belongsTo House
House hasMany Visit

查看

  • 我有一个名为 house/index.ctp 的所有房屋的视图。
  • 它列出了每所房子的 ID 和名称。
  • 我还使用 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 表的新列中“缓存”每个最大访问量,但它非常脏。

感谢您的帮助。

【问题讨论】:

  • but I failed 是什么意思?有任何错误信息吗?
  • 我只是编辑问题以添加我尝试过的虚拟字段。

标签: php cakephp field cakephp-2.2 paginator


【解决方案1】:

为此声明一个虚拟字段可能很棘手,因此我建议您在需要时随时添加它。

所以您的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 以使其更像蛋糕。

希望对你有帮助。

【讨论】:

  • 嘿,看起来不错。我检查并反馈。
  • 同样的事情,列出上次访问很好,但分页器无法根据这些日期进行排序。
  • @Starflash 你是对的,我刚刚编辑了代码,现在它更干净并且允许排序;)
  • 谢谢@luchomolina,它有效!我只是更改了连接类型,以便能够查看所有房屋(包括没有访问)。
【解决方案2】:

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

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

我尚未对此进行测试,但它应该非常接近您的需要。您可能需要为 contain 添加一个限制,这样您就只能看到最近的 x 次访问。

【讨论】:

  • @luchomolina,我查看了您的编辑,但不确定您是否正确。看下面的例子:book.cakephp.org/2.0/en/core-libraries/behaviors/…
  • 这很有趣,我根据我正在运行的测试对其进行了编辑。我有一个用于 Stackoverflow 问题的沙箱:P 并且运行您的代码会引发此通知(不是错误,抱歉):“间接修改重载属性 HousesController::$paginate 没有效果”——也许有人应该修复面包店?
  • 嗯,这似乎是一种解决问题的有趣方法。我可以获取所有数据,但正如@luchomolina 所说,不会对该列进行排序。
  • 这个功能很好用,我不知道。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多