是否使用两个嵌套的WHERE子句?

时间:2016-10-29 10:07:57

标签: php mysql sql laravel

这是我的问题:

    $first = DB::table('news')
        ->selectRaw('"news" as tableName, id, title, description, imgPath')
        ->where(function($query) use ($q) {
            $query->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q));
        });

    $results = DB::table('productions')
        ->selectRaw('"productions" as tableName, id, title, description, imgPath')
        ->where(function($query) use ($q) {
            $query->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q));
        })
        ->unionAll($first)
        ->get();

如您所见,有一个where(),其中还有一个whereRaw() ..它是否正确?

结果还可以,我的意思是它完全符合预期..只是我担心性能。你知道,我想我只能通过一个where()做到这一点。但是目前它也可以运行,但是如果数据集很大,我恐怕它可能会很慢。

无论如何,我的代码好吗?

2 个答案:

答案 0 :(得分:0)

在功能方面我没有说什么特别错误,但有些事情你可以清理,例如您正在执行selectRaw,因此您可以为表格添加别名,但您永远不会使用别名。

$first = DB::table('news')
    ->select(['id', 'title', 'description', 'imgPath'])
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)");

$results = DB::table('productions')
    ->select(['id', 'title', 'description', 'imgPath'])
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)")
    ->unionAll($first)
    ->get();

尝试以上操作,如果这不起作用,请尝试使用select语句替换selectRaw语句。

答案 1 :(得分:0)

无需在where()闭包中添加单个位置。您可以在没有它的情况下编写代码:

$first = DB::table('news')
    ->selectRaw('"news" as tableName, id, title, description, imgPath')
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q));

$results = DB::table('productions')
    ->selectRaw('"productions" as tableName, id, title, description, imgPath')
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q));
    ->unionAll($first)
    ->get();

但如果您真的关注数据集变得庞大时的性能,那么我建议您使用paginate()函数而不是get()