过滤值时的Laravel条件子句

Posted

技术标签:

【中文标题】过滤值时的Laravel条件子句【英文标题】:Laravel conditional clause when for filtering value 【发布时间】:2019-03-17 08:44:52 【问题描述】:

我有一个状态为 o 或 1 的事件表。

我必须过滤状态为 1,0 或 ALL 的事件。

当条件子句时我尝试使用 laravel,它不能使用零值,其他条件正在工作。

$status    = Input::get('status');
$events    = DB::table('events')
          ->select('events.*')
          ->when($status, function ($query) use ($status) 
           return $query->where("events.status",$status);
           )
          ->get();

【问题讨论】:

试试$status = Input::get('status') ? 1 : 0;。状态参数可能是一个字符串,您只需要两个选项 1 和 0(用户可以更改状态参数) 您是否阅读了laravel.com/docs/master/queries 的文档?它指出“when 方法仅在第一个参数为 true 时执行给定的 Closure。如果第一个参数为 false,则不会执行 Closure。” 【参考方案1】:

when方法中使用的in_array函数试试这个

因为 0(zero) 意味着 (false) 默认理解所以尝试在 when 方法中使用内部函数

如果没有通过状态,则将默认值设置为2 或任何数字,但不是0,1 and null

$status  = Input::has('status') ? Input::get('status') : 2;

$events  = DB::table('events')->select('events.*')
          ->when(in_array($status,[0,1]), function ($query) use ($status) 
                return $query->where("events.status",$status);
           )->get();

第二种方式创建一个新函数

   function checkStatus($status,$array) 
       if(isset($status)) 
           return in_array($status,$array);
      

      return false;
    



$events  = DB::table('events')->select('events.*')
                  ->when(checkStatus($status,[0,1]), function ($query) use ($status) 
                        return $query->where("events.status",$status);
                   )->get();

【讨论】:

events 中选择events.*,其中events.status 为空;当我没有通过值时得到这个 我在过滤器部分使用它,如果没有通过状态,那么查询应该在没有 where 条件的情况下工作,否则使用 0 或 1 @Rp9 也通过创建新函数并检查以第二种方式使用

以上是关于过滤值时的Laravel条件子句的主要内容,如果未能解决你的问题,请参考以下文章

LARAVEL 5.8 - 在 foreach 中使用数组的 WHERE LIKE 子句的多个条件没有给出完整的结果

Laravel 查询关系 where 子句

Laravel 4 条件路由过滤器

Laravel Passport:发送令牌请求时的附加模型条件

Laravel 7 雄辩的嵌套条件,用于使用枢轴进行过滤

Laravel - 按“字段及其关系模型字段”之间的条件过滤模型