【问题标题】:CakePHP 2.4.4 Unable to sort/order by virtual field with paginate (Paginator)CakePHP 2.4.4 无法使用分页(分页器)按虚拟字段排序/排序
【发布时间】:2023-03-10 11:32:02
【问题描述】:

我在 beforeFind() 中生成的属性模型的虚拟字段,称为“距离”,有效。但是,我无法对其进行排序。我目前将此作为搜索表单的一部分:

echo $this->Form->input('sort', array(
    'options' => Hash::get($predefined, 'sort'), // List of options
));

这将排序添加到 URL,它适用于所有普通字段,但不适用于虚拟字段距离。我应该以不同的方式实施吗?据我所知,Virtual Fields 应该可以很好地处理分页。

编辑:如果我实现了错误的分页...

我已经设置了默认值:

public $paginate = array(
    'limit' => 25,
    'order' => array(
       'Properties.id' => 'asc'
    )
);

构建 $conditions 后:

$this->Paginator->settings = $this->paginate;
$data = $this->Paginator->paginate('Property', $conditions);
$this->set('properties', $data);

即使通过直接编辑 URL 中的 /sort:fieldname/ ,上述方法也可以很好地更改顺序,但不能使用虚拟字段“距离”。我也尝试添加,但没有成功:

$this->paginate['order'] = array($value); //Value is the value for 'sort' named parameter

【问题讨论】:

  • “由于虚拟字段在查找时的行为与常规字段非常相似,因此 Controller::paginate() 也将能够按虚拟字段排序。” book.cakephp.org/2.0/en/models/…
  • 这正是我的观点。
  • 尝试使用第三个参数(白名单)进行分页(api.cakephp.org/2.4/…)。如果它不会帮助放置更多代码(beforeFilter 方法和更多控制器方法)。
  • 这与问题无关,但很有用,谢谢,我从现在开始实施

标签: sorting cakephp pagination virtual


【解决方案1】:

这部分信息:

属性模型的我的虚拟字段,在 beforeFind() 中生成,

似乎是个问题。

需要在调用 Paginate() 之前定义虚拟字段,以便分页器知道构建“排序”标准。

beforeFind() 调用发生在 分页调用之后,因此您的虚拟字段尚未定义。将虚拟字段的定义移动到分页调用的正上方应该可以解决此问题。

【讨论】:

  • 虚拟字段可以在模型中声明为数组,public $virtualFields = array();或其他地方,使用 $this->virtualFields['fieldName'] = ,它允许您仅在需要时创建字段。在 beforeFind 中这样做会将它放在任何 sql 之前,因此它的行为应该完全相同
  • 尝试搜索“动态虚拟字段”
  • 我找不到那个。不过,在我看来,当分页试图找出排序顺序时,您的虚拟字段实际上并没有被定义。并认为这发生在致电beforeFind() 之前。所以我会尝试在模型中定义它,而不是动态定义。或者,如果您是即时执行的,请在调用 Paginate() 之前定义它,而不是 beforeFind()
  • 它更靠近虚拟字段页面的底部。用户必须先在搜索表单中输入“邮政编码”,否则将无法计算距离,因此必须在输入字段之前进行检查。我会在 Paginate 运行之前尝试通过控制器添加它
  • 解决了!您对事件的顺序是正确的,该字段必须在分页之前存在,因为 beforeFind 将在分页内。如果您想编辑您的答案以包含您的建议,我可以接受它
猜你喜欢
  • 2014-03-15
  • 2011-08-26
  • 2015-10-24
  • 2016-06-12
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2014-07-12
  • 2012-07-07
相关资源
最近更新 更多