2017-10-19 3 views
1

J'ai fait la fonction de recherche qui ressemble fonctionne à la place une clause where. Je veux dans les résultats ne pas montrer les éléments qui ne sont pas encore publiés.La fonction de recherche renvoie les résultats non désirés dans Laravel

Donc, si l'article a published = 0 dans la base de données ne devrait pas être montré sur la page même si est rencontré les conditions de recherche.

C'est ma fonction

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')); 
} 

Ce que j'ai ajouté est

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

qui devrait porter cette condition, mais je vois encore des articles non publiés à la page. Pourquoi donc?

toSql retour

select * from `items` where `title` like ? and `published` = ? and (`alias` like ? or `description` like ?) or exists (select * from `categories` where `items`.`category_id` = `categories`.`id` and `title` like ?) or exists (select * from `countries` where `items`.`country_id` = `countries`.`id` and `name` like ?) limit 5 offset 0 

Répondre

3

imprimera le SQL et vous verrez pourquoi. Les conditions de groupes SQL autour de l'OR qui signifient condition 1 ou condition 2 AND condition 3 sont évaluées séparément.

C'est pourquoi vous conditions de nid avec des parenthèses si la condition 3 est toujours évaluée:

(condition 1 OR condition 2) AND condition 3

va de même pour Laravel, la façon dont vous nid avec callbacks:

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

Vous peut toujours utiliser $query->toSql() pour voir une représentation du SQL généré.

+0

Merci. J'ai essayé mais je vois toujours tous les résultats. J'ai ajouté le sql en question – Ivan

+0

Vous avez toujours l'autre ou les conditions en place. – Devon

+0

Oui, parce qu'ils regardent d'autres tables. – Ivan