Cakephp 3.0 如何使用CAKEPHP3实现订单下的CASE

Cakephp 3.0 如何使用CAKEPHP3实现订单下的CASE,cakephp-3.0,cakephp-3.4,Cakephp 3.0,Cakephp 3.4,SQL: SELECT Students.name AS `Students__name`, Students.role AS `Students__role` FROM students Students WHERE id IN (1053,1056,733,734,735,736,737,739,748) AND name LIKE '%v%' ORDER BY CASE WHEN name LIKE '%v' THEN 1 WHEN name LIKE 'v%'

SQL:

SELECT Students.name AS `Students__name`, Students.role AS 
`Students__role` FROM students Students
WHERE id IN 
  (1053,1056,733,734,735,736,737,739,748) 
  AND name LIKE '%v%' ORDER BY 
CASE 
  WHEN name LIKE '%v' THEN 1
  WHEN name LIKE 'v%' THEN 2
  WHEN name LIKE '%v%' THEN 3
  ELSE 4
END
到目前为止:

$SInfo = TableRegistry::get('Students')->find()
->where(function($ex) use ($sArray, $sName) {
    $ex->in('id', $sArray);
    $ex->like('name', '%'.$sName.'%');
    return $ex;
});
->select(['name', 'role']);

order()
函数不接受ExpressionQuery。我曾尝试在order下使用
$ex->addCase()
,但也不起作用。

如果要在
order()
方法中使用CASE语句,可以这样编写:

$SInfo = TableRegistry::get('Students')->find()
    ->select(['name', 'role'])
    ->where(function($ex) use ($sArray, $sName) {
        $ex->in('id', $sArray);
        $ex->like('name', '%' . $sName . '%');
        return $ex; 
    })
    ->order('(CASE WHEN name LIKE \'%v\' then 1 when name LIKE \'v%\' then 2 when name LIKE \'%v%\' then 3 else 4 END)');
编辑:正如本答案评论中所建议的(谢谢@ndm),您应该使用相应的CASE表达式:

$SInfo = TableRegistry::get('Students')->find()
->select(['name', 'role'])
->where(function($ex) use ($sArray, $sName) {
    $ex->in('id', $sArray);
    $ex->like('name', '%' . $sName . '%');
    return $ex; 
})
->order(function ($exp, $q) {
    return $exp->addCase(
        [
            $q->newExpr()->like('name', '%v'),
            $q->newExpr()->like('name', 'v%'),
            $q->newExpr()->like('name', '%v%'),
        ],
        [1,  2, 3, 4], # values matching conditions
        ['integer', 'integer', 'integer', 'integer'] # type of each value
    );
});

我想你可以简单地把整个CASE语句放在
order()
方法中:
->order(['CASE-WHEN…')
请展示你是如何使用这些表达式的,在order子句中传递它们应该可以。我强烈建议使用相应的CASE表达式@ndm我根据你的建议编辑了我的答案,谢谢!我错过了使用
newExpr()
的部分,我尝试直接使用
$exp->like()
进行迭代。谢谢你给了我正确的方向。@SamHecquet因为一个深思熟虑的、快速的、规范的回应而获得了赏金。