Laravel按条件雄辩或SQL命令

use*_*996 3 sql query-builder eloquent laravel-4

我在数据库表中有这些时间戳列-到期,编辑,created_at。如果项目的“到期”日期大于今天的日期,则需要按“编辑”进行排序,否则,需要按“ created_at”进行排序。

我正在尝试类似的操作,但无法正常工作

$items = $items
->orderBy(DB::raw("CASE WHEN expiration >= $time THEN edit ELSE created_at END"), 'DESC')
->get();
Run Code Online (Sandbox Code Playgroud)

要么

$items = $items
->orderBy(DB::raw("CASE WHEN expiration >= $time THEN edit END"), 'DESC')
->orderBy('created_at', 'DESC')
->get();
Run Code Online (Sandbox Code Playgroud)

变量$ time是正确的,所以我的问题出在查询中。样本数据:

id   name   created_at             expiration             edit
1.   it1    2015-03-16 15:42:40    0000-00-00 00:00:00    2015-03-16 15:42:40
2.   it2    2015-03-16 15:37:27    2015-03-16 00:00:00    2015-03-16 15:37:27
3.   it3    2015-03-16 12:36:50    2015-03-27 00:00:00    2015-03-16 14:52:19
Run Code Online (Sandbox Code Playgroud)

我需要按顺序-> it3,it1,it2

可变的$ time = 2015-03-17

小智 5

如果您想在order by子句中使用“ Case”,则有两种方式:假设用户想查看“ Order By”搜索文本,即“ tamil nadu”

1:

->orderByRaw('case 
    when `title` LIKE "%tamil nadu%" then 1
    when `title` LIKE "%tamil%"  then 2 
    when `title` LIKE "%nadu%"  then 3 
    else 4 end');
Run Code Online (Sandbox Code Playgroud)

2:按条件将您的条件/案例传递给order

$searchText = explode(" ", $searchingFor);
$orderByRowCase = 'case when title LIKE "%tamil nadu%" then 1 ';
foreach ($searchText as $key => $regionSplitedText) {
   $Key += 2;
   $orderByRowCase .= ' when title LIKE "%' . $regionSplitedText . '%" then ' . $Key . '';
}
$orderByRowCase .= ' else 4 end';   
Run Code Online (Sandbox Code Playgroud)

(您的Laravel查询)

->orderByRaw($orderByRowCase);
Run Code Online (Sandbox Code Playgroud)


Jar*_*zyk 0

->orderByRaw(
     "CASE WHEN expiration >= {$time} THEN edit ELSE created_at END DESC"
)
Run Code Online (Sandbox Code Playgroud)

编辑:你的例子表明你想要一些你所要求的东西。你的集合的顺序是it1, it2, it3。要了解该行为,请尝试以下操作:

select 
  name, 
  case when expiration >= '2015-03-17' then edit else created_at end as order_value 
from YOUR_TABLE 
order by case when expiration >= '2015-03-17' then edit else created_at end desc;
Run Code Online (Sandbox Code Playgroud)

它将显示 order by 子句所采用的值:

| name | order_value         |
| it1  | 2015-03-16 15:42:40 |
| it2  | 2015-03-16 15:37:27 |
| it3  | 2015-03-16 14:52:19 |
Run Code Online (Sandbox Code Playgroud)

所以,我想您实际上需要按 IS_EXPIRED 订购,然后按日期订购?然后你需要两个case子句,或者类似这样的东西:

->orderByRaw(
     "CASE WHEN expiration >= {$time} THEN concat('1 ', edit)
           ELSE concat('0 ',created_at) END DESC"
)
Run Code Online (Sandbox Code Playgroud)