Laravel where if 语句

Posted

技术标签:

【中文标题】Laravel where if 语句【英文标题】:Laravel where if statement 【发布时间】:2016-02-02 01:36:18 【问题描述】:

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

type | number | date

我需要根据列(类型)在哪里做

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

因此,如果类型等于 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 方式:

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

【问题讨论】:

【参考方案1】:

您应该为此使用case

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

【讨论】:

这是我需要的,但 mysql 给出错误您的 SQL 语法有错误; WHERE CASE WHEN type=days THEN finish_at > 1 ELSE left > 0 END @PoWeR 将进行检查并更新答案。【参考方案2】:
$date = '';//Date you want
$number = ''//Number you want
$field = ''//date or number
SomeModel::where($field, '=', $value)->where('type', '=', 'sometype');

你可以通过这种方式使用 Laravel 的 Eloquent,不需要在单行中进行方法链接。

编辑:起初我没有得到正确的问题。现在它的固定假设你也将动态“类型”投入使用声明。

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

【讨论】:

你是从哪里得到变量 $type 的?我想你没有得到问题【参考方案3】:

试试这个:

$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 来解决这个问题。如果需要,还需要一个 where 包裹在 orWhere 之外,以便用另一个条件来说明。

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

Laravel Eloquent Select CASE?

【讨论】:

很好的解决方案但是我不能使用或者我需要确切的位置 您使用的是什么 DBMS? @PoWeR 如果您使用的是 MySQL,请查看 DB raw queries 。在 where 中使用 Case 可能会有所帮助。 ***.com/questions/17092112/… MySQL我去看看【参考方案4】:

你可以像 as 一样使用它

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

使用 Laravel Eloquent,您可以像使用它一样使用它

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

【讨论】:

您的 SQL 语法有误; WHERE IF (type = days, finish_at > now() ,left > 0)' at line 3 这里的days 是什么?您没有在问题中指定它 这是我的数据,类型是字符串,如果只接受整数? 请清楚说明您的条件。您想要实现的目标以及您在此处使用的变量也会发布您在此处遇到的原始错误 更新了我的问题。谢谢。

以上是关于Laravel where if 语句的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询生成器 where 和 or where

Laravel ORM 怎么在条件语句中做本表的一个字段和关联表的字段做比较?

我想自学laraver,请诸位前辈给一些建议,谢谢

Laravel UNION ALL 不适用于 where 语句

如何在 switch 语句中使用 laravel 模型运行多个 Where 子句

laravel 语言插件