Laravel if if声明

时间:2015-11-02 08:01:23

标签: php mysql laravel eloquent

我遇到了从DB中选择的问题。 基本上我想要实现的是: 我有一个有3列的表

type | number | date

我需要根据列(类型)进行操作

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

因此,如果type等于1,则将数字应用于数字,否则应用于何处。有可能这样想吗? Laravel Eloquent可以做到吗? 谢谢。

原始查询和数据类型是: 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 ( ID为) ) 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 Way:

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

4 个答案:

答案 0 :(得分:2)

您应该使用case

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

答案 1 :(得分:2)

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

你可以用这种方式使用Eraquent of Laravel,它不需要在单行中进行方法链接。

编辑:在第一个我没有得到正确的问题。现在它固定假设您将动态“类型”也将其用于使用声明。

编辑2:您可以根据if条件将字段表示为文字,然后将其传递给where子句。

答案 2 :(得分:1)

您可以像

一样使用它
SELECT * FROM tablename WHERE IF (`type` = 1, `number` > 1,`date` = today())

使用Laravel Eloquent,您可以像

一样使用它
ModelName::whereRaw('IF (`type` = 1, `number` > 1,`date` = today())')->get();

答案 3 :(得分: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来解决这个问题。并且如果需要,需要在外面或在哪里使用其他条件清楚。

如果您使用的是MySQL,请尝试使用DB :: raw并在WHERE中使用CASE:

Laravel Eloquent Select CASE?