3

我正在尝试使用以下代码在 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',
        ),
    ),
);

但是,由于某种原因FIELD(Project.status, 1, 3, 4, 0, 2) DESC被 Cake 忽略了。你能帮我让它工作吗?

4

2 回答 2

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;
    }

 }
于 2013-05-22T15:50:21.537 回答
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',
    ),
);
于 2016-06-16T09:13:29.173 回答