2015-11-02 4 views
3

У меня возникла проблема с выбором из базы данных. В основном то, что я пытаюсь достичь: У меня есть таблица с 3 столбцамиLaravel where if statemnet

type | number | date 

мне нужно делать, где на основе столбца (типа)

If(type = 1) then where number > 1 else where date today() 

Так что, если тип равен 1 затем примените, где к числу других применяется то, что на сегодняшний день. Можно ли так думать? И это можно сделать с Laravel Racquent? Спасибо.

Исходный запрос и тип данных являются: type = string number = integer date = timestamp (Y-m-d H:i:s)

Запрос

SELECT * FROM table_name WHERE CASE WHEN type=days THEN date>now() ELSE number>0 END

Таблица схемы CREATE TABLE banners ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, type varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0', number int(10) unsigned NOT NULL DEFAULT '0', finish_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY ( идентификатор ) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Решение, которое работало:

select * from `banners` 
where `banners`.`block_id` = 1 and `banners`.`block_id` is not null 
and IF (`type` = 'days', `finish_at` > now(), `number` > 0) 

Laravel Путь:

ParentModel::banners()->whereRaw("IF (`type` = 'days', `finish_at` > now(), `number` > 0)")->get(); 

ответ

1

Вы можете использовать его как в качестве

SELECT * FROM tablename WHERE IF (`type` = 1, `number` > 1,`date` = today()) 

Использование Laravel красноречивый вы можете использовать его как

ModelName::whereRaw('IF (`type` = 1, `number` > 1,`date` = today())')->get(); 
+0

У вас есть ошибка в синтаксисе SQL; 'WHERE IF (type = days, finish_at> now(), left> 0) 'at line 3' – Froxz

+0

Что такое' days' здесь? Вы не указали его в своем вопросе –

+0

Это мои данные, тип - это строка, если принимает только целые числа? – Froxz

2

Вы должны использовать case для этого,

SELECT * FROM tablename 
WHERE CASE WHEN type = 1 THEN number > 1 ELSE date = today() END 
+0

Это то, что мне нужно, но MySQL дает ошибку. У вас есть ошибка в SQL синтаксис; 'WHERE CASE WHEN type = days THEN finish_at> 1 ELSE left> 0 END' – Froxz

+0

@PoWeR проверит и обновит ответ. –

+0

@PoWeR проверить сейчас ... посмотрите, работает ли он. –

2
$date = '';//Date you want 
$number = ''//Number you want 
$field = ''//date or number 
SomeModel::where($field, '=', $value)->where('type', '=', 'sometype'); 

Вы можете использовать красноречивый Laravel таким образом, его не нужно делать метод цепочки в одной строке.

РЕДАКТИРОВАТЬ: На первом я не получил вопрос правильно. Теперь его фиксированное предположение, что у вас будет динамический «тип», также вставляйте его в употребление.

EDIT 2: Вы можете представить поле как литерал в соответствии с условием if, а затем передать его в предложение where.

+0

Откуда у вас был переменный тип $? Я думаю, у вас не было вопроса – Froxz

+0

Я отредактировал мой вопрос –

0

Попробуйте это:

$query = SomeModel::where(function($query){ 
          $query->where(function($query){ 
           $query->where('type',1)->where('number',1) 
          }) 
          ->orWhere(function($query){ 
           $query->where('type',1)->where('date', today()) 
          }) 
         }) 

Мы используем orWhere, чтобы решить эту проблему. И нужно, чтобы где-то обертывалось за пределами orWhere, чтобы было ясно с другим условием, если это необходимо.

Если вы используете MySQL, попробуйте DB :: сырец и случай использования в ГДЕ:

Laravel Eloquent Select CASE?

+0

Хорошее решение Но я не могу использовать ИЛИ мне нужно точное, где – Froxz

+0

Какие СУБД вы используете? – Chung

+0

@PoWeR, если вы используете MySQL, просто взгляните на необработанные запросы DB. Использование Case в том, где может помочь. http://stackoverflow.com/questions/17092112/laravel-eloquent-select-case – Chung