我遇到了从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();
答案 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: