搜索功能在Laravel中返回不需要的结果

时间:2017-10-19 12:59:45

标签: php laravel

我已经制作了一个看起来像是一个MenuItem子句的搜索功能。我希望在结果中不显示尚未发布的项目。

因此,即使符合搜索条件,如果数据库中的项目where也不应显示在页面上。

这是我的功能

published = 0

我添加的是

public function search(Request $request)
{

    $searchText = strip_tags($request['q']);
    $seachLocation = strip_tags($request['l']);


    $columns =['alias','description'];

    $query = Item::select('*');

    $query->where( 'title', 'like', '%'.$searchText.'%');
    $query->where('published', 1);
    foreach( $columns as $column) {
        $query->orWhere( $column, 'like', '%'.$searchText.'%', '%'.$seachLocation.'%');
    }

    $query->orWhereHas('category',function( $query ) use (  $searchText ) {
        $query->where('title', 'like', '%'.$searchText.'%' );
    });

    $query->orWhereHas('country',function( $query ) use (  $searchText ) {
        $query->where('name', 'like', '%'.$searchText.'%' );
    });

    $items = $query->paginate(5);
    $searchQuery = $searchText;
    $searchQueryLoc = $seachLocation;


    return view('search', compact('items','searchQuery','seachLocation'));
}

应该带有这个条件,但我仍然看到页面上未发布的项目。那是为什么?

toSql return

$query->where('published', 1);

1 个答案:

答案 0 :(得分:2)

打印出SQL,你会明白为什么。 OR对OR周围的条件进行分组,这意味着condition 1 OR condition 2 AND condition 3将单独评估。

这就是您使用括号嵌套条件的原因,因此始终会评估条件3:

(condition 1 OR condition 2) AND condition 3

Laravel也是如此,你的嵌套方式是回调:

$query->where(function($q) use ($columns, $searchText, $seachLocation) {
     foreach( $columns as $column) {
         $q->orWhere( $column, 'like', '%'.$searchText.'%', '%'.$seachLocation.'%');
     }
}

您始终可以使用$query->toSql()查看生成的SQL的表示。