我正在尝试使用以下代码在CakePHP 2应用程序中实现自定义排序顺序:
var $paginate = array(
'Project' => array(
'conditions' => array('Project.deleted' => 0),
'order' => array(
'Project.pinned' => 'desc',
'FIELD(Project.status, 1, 3, 4, 0, 2) DESC'
'Project.date_start' => 'asc',
'Project.name' => 'asc',
),
),
);
但是,由于某种原因,Cake会忽略FIELD(Project.status, 1, 3, 4, 0, 2) DESC
。你能帮我把它搞定吗?
答案 0 :(得分:1)
我通过在/lib/Cake/Controller/Component/PaginatorComponent.php中进行更改来实现它的工作
我刚刚发现了如何做到这一点,我知道它并不完美,因为它不能验证声明是否正确,但我认为对于遇到此问题的人来说这是一个良好的开端。
在函数validateSort中,我添加了最后一个elseif,它是一个ORDER BY FIELD。问题是$ order [$ alias。'。'。$ field] = $ value不能用于FIELD,因为它与大多数其他ORDER BY子句的工作方式不同。
foreach ($options['order'] as $key => $value) {
$field = $key;
$alias = $object->alias;
if (strpos($key, '.') !== false) {
list($alias, $field) = explode('.', $key);
}
if ($object->hasField($field)) {
$order[$alias . '.' . $field] = $value;
} elseif ($object->hasField($key, true)) {
$order[$field] = $value;
} elseif (isset($object->{$alias}) && $object->{$alias}->hasField($field, true)) {
$order[$alias . '.' . $field] = $value;
} elseif (strpos($alias, 'FIELD')==0){
$order[$key]=$value;
}
}
答案 1 :(得分:0)
从订单中删除数组,删除数组
后它在我的情况下工作var $paginate = array(
'Project' => array(
'conditions' => array('Project.deleted' => 0),
'order' =>
'Project.pinned' => 'desc',
'FIELD(Project.status, 1, 3, 4, 0, 2) DESC'
'Project.date_start' => 'asc',
'Project.name' => 'asc',
),
);