2017-10-19 7 views
1

検索機能を作成しましたが、代わりにwhere節が1つ働いています。私は、結果がまだ出版されていない項目を表示しないようにしたい。検索機能が不要な結果を返します。

データベース内の項目が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')); 
} 

私は何を追加したことは、この条件を運ぶが、私はまだページで公開されていない項目が表示されるはずです

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

である私の関数です。何故ですか?

は、SQLから

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 

答えて

3

印刷を返しtoSql、あなたはその理由が表示されます。 ORのまわりのSQLグループ条件は、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.'%'); 
    } 
} 

ます生成されたSQLの表現を見るには、常に$query->toSql()を使用できます。

+0

ありがとうございました。私はこれを試したが、まだすべての結果を参照してください。問題のSQLを追加しました – Ivan

+0

あなたはまだ他の条件があります。 – Devon

+0

はい、他のテーブルを探しているからです。 – Ivan

関連する問題