我已经制作了一个看起来像是一个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);
答案 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的表示。