在CakePHP中使用FIELD的顺序

时间:2012-08-01 10:11:54

标签: mysql cakephp-2.0

我正在尝试使用以下代码在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。你能帮我把它搞定吗?

2 个答案:

答案 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',
    ),
);