Laravel 4:可选 where 子句

Posted

技术标签:

【中文标题】Laravel 4:可选 where 子句【英文标题】:Laravel 4: optional wherein clause 【发布时间】:2013-10-12 17:29:03 【问题描述】:

基本上,我在 Laravel 中有一个路由系统,它传递一个可选的高级标签名称,该名称用于从数据库集合(我正在使用 MongoDB)中检索标签列表,并依次使用该标签列表从另一个集合。

我的控制器:

public function index($tag)
   $tags = array();

if ($tag)
//get an array of tags from db


$data = DB::collection('notices')
->whereIn("tags", $tags //<-- an array of tags)
->GET(...);

现在,当我给出一个标签并且有一个数组要传递给 whereIn 子句时,就会按预期检索数据。但是,如果未给出参数,则查询将返回错误,因为没有可查询的内容。

因此,我需要知道在 Laravel 中是否有可能 以某种方式使 ->whereIn 成为可选的,或者给它一个数组,这样 查询就像没有 where 子句一样

【问题讨论】:

你考虑过使用if ($tag) ... -&gt;whereIn ... else ... without whereIn ... 【参考方案1】:

在 Laravel 5+ 中,您可以使用“条件子句”:https://laravel.com/docs/5.3/queries#conditional-clauses

$role = $request->input('role');

$users = DB::table('users')
                ->when($role, function ($query) use ($role) 
                    return $query->where('role_id', $role);
                )
                ->get();

【讨论】:

【参考方案2】:

这就是你要找的东西:

public function index($tag)
    $tags = array();

    $data = DB::collection('notices');

    if ($tag)
        //get an array of tags from db
        $data->whereIn("tags", $tags //<-- an array of tags)
    

    $data->get(...);

【讨论】:

看来我用来建模 mongodb (Lessegerns\MongoDB) 的插件不允许这样的分离,因为如果我尝试不这样做,它会给我“类对象无法转换为字符串”错误将命令链接在一起。

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

Laravel 4 Eloquent 动态 Where 子句

Laravel 4:将 where 子句添加到连接条件

Laravel 4:如何在 where 子句中使用访问器

Laravel 4.2 雄辩的动态查询

4 个连接 + 3 个 where 子句的查询构建器正确语法(Laravel 5.7)

LINQ to SQL Where 子句可选条件