2015-03-17 2 views
1

У меня эти столбцы timestamp в таблице базы данных - expiration, edit, created_at. Мне нужно заказать «edit», если дата «expiration» больше, чем сегодняшняя дата, иначе мне нужно заказать «created_at».Laravel order by conditions eloquent или sql

Я что-то вроде этого пытаюсь, но он не работает правильно

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

или

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

переменных $ времени правильно, так что моя проблема в запросе. Выборочные данные:

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 

И мне нужно в порядке -> и3, It1, IT2

переменной $ времени = 2015-03-17

ответ

0
->orderByRaw(
    "CASE WHEN expiration >= {$time} THEN edit ELSE created_at END DESC" 
) 

редактировать: Ваш пример показывает, что вам нужно что-то еще в том, что вы просили. Заказ вашего набора будет 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; 

он покажет вам значение, которое берется для того, пунктом:

| name | order_value   | 
| it1 | 2015-03-16 15:42:40 | 
| it2 | 2015-03-16 15:37:27 | 
| it3 | 2015-03-16 14:52:19 | 

Итак, я полагаю, вам на самом деле нужно порядке IS_EXPIRED и то к дате? Тогда вам понадобятся два case положения, или что-то вроде этого:

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

Это показывает order_by редактировать, когда действия не> = {$} время. – user3921996

+0

Можете ли вы уточнить? Если вы действительно хотите заказать «X» или «Y», то это то, что вам нужно. Возможно, вы хотите заказать «X» сначала, а затем «Y»? Покажите пример данных и ожидаемый результат. –

+0

Я добавил к своему вопросу несколько данных – user3921996

2

Если и хотите использовать «Case» в порядке статьи было 2 пути: Предположим, пользователь хочет просмотреть «Заказывайте» поиска текста т.е. "Тамилнад"

1:

->orderByRaw('case <br/> 
    when `title` LIKE "%tamil nadu%" then 1 <br/> 
    when `title` LIKE "%tamil%" then 2 <br/> 
    when `title` LIKE "%nadu%" then 3 <br/> 
    else 4 end'); 

2:
Проденьте условие/случай на заказ по п

$searchText = explode(" ", $searchingFor);<br/> 
$orderByRowCase = 'case when title LIKE "%tamil nadu%" then 1 ';<br/> 
foreach ($$searchText as $key => $regionSplitedText) {<br/> 
&nbsp;&nbsp;&nbsp;$Key += 2;<br/> 
&nbsp;&nbsp;&nbsp;$orderByRowCase .= ' when title LIKE "%' . $regionSplitedText . '%" then ' . $Key . '';<br/> 
}<br/> 
$orderByRowCase .= ' else 4 end'; <br/> 

(Ваш Laravel Query)

->orderByRaw($orderByRowCase);