【问题标题】:Ignore "where" clause in Laravel database query if no filter is provided如果没有提供过滤器,则忽略 Laravel 数据库查询中的“where”子句
【发布时间】:2016-06-18 13:03:56
【问题描述】:

我目前正在尝试在 Laravel 5.1 中找到最简洁的查询方式。我正在创建一个从 MySQL 数据库返回 JSON 字符串的 API。

我希望能够有一个类似的网址

mydomain.com/api/courses

这将返回我们所有课程的 JSON 列表。而且我还希望能够传入一个 GET 查询参数,例如

mydomain.com/api/courses?subject=BUS

这将只返回商业课程。到目前为止非常基本。在我的控制器中,我有

$subject = \Request::input('subject');

if ($subject) {                                     //filter to only query parameters
    $results    = \DB::table('course_listings')
                    ->where('subject', $subject)
                    ->get();
} else {                                            //return all results
    $results = \DB::table('course_listings')->get();
}

但是,这似乎有点不必要的混乱,特别是如果我想开始添加额外的查询参数。如果查询参数为空,我想做的是能够忽略where()

$results = \DB::table('course_listings')
    ->where('subject', $subject) //ignore this line if no $subject
    ->get();

出于性能目的,我还希望避免加载所有结果,然后再应用过滤器。 Laravel 中是否为此构建了任何东西?

【问题讨论】:

    标签: php database laravel eloquent


    【解决方案1】:

    您可以将查询保存到变量中,然后仅在您的 if 块中应用 where

    $subject = Request::input('subject');
    
    $query = DB::table('course_listings');
    
    if ($subject) {
        $query->where('subject', $subject);
    }
    
    $results = $query->get();
    

    如果你想完全放弃if 语句,你可以这样做:

    $constraints = array_only(Request::input(), 'subject');
    
    $results = DB::table('course_listings')->where($constraints)->get();
    

    【讨论】:

    • 啊,完美。对于每个额外的查询参数,我只需要一个额外的if 语句,对吗?
    • @cchapman - 如果你有很多这样的参数,也许使用array_only 会更好。
    猜你喜欢
    • 2012-09-18
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多