I came to a problem with select from DB. Basically what I am trying to achieve is: I have a table with 3 columns
type | number | date
I need to do where based on column (type)
If(type = 1) then where number > 1 else where date today()
So if the type is equal to 1 then apply where to number else apply where to date. It is possible to do such a thing? And it is possible to do it with Laravel Eloquent? Thank you.
The original query and datatype are:
type = string number = integer date = timestamp (Y-m-d H:i:s)
Query
SELECT * FROM table_name
WHERE CASE WHEN type = days THEN date > now() ELSE number > 0 END
Table schema
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 (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Solution that worked:
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 Way:
ParentModel::banners()->whereRaw("IF (`type` = 'days', `finish_at` > now(), `number` > 0)")->get();
You can use it like as
SELECT * FROM tablename WHERE IF (`type` = 1, `number` > 1,`date` = today())
Using Laravel Eloquent you can use it like as
ModelName::whereRaw('IF (`type` = 1, `number` > 1,`date` = today())')->get();
You should use case
for this,
SELECT * FROM tablename
WHERE CASE WHEN type = 1 THEN number > 1 ELSE date = today() END
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With