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)
->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)