Laravelのクエリビルダーについて質問させてください。
Laravel5.4のクエリビルダーでwhereやorWhereなどを使っての条件抽出について
うまくいかずに困っています。
記事を表示するサイトに検索の機能を作ろうと思い、
viewの検索窓から$keywordをコントローラーに送り
コントローラーで下記のような形でwhereやorWhereなどを使ってデータの抽出処理をしています。
PHP
1 public function topSearch(Request $request){ 2 3 $keywords = $request->input('keywords'); 4 //省略 5 6//検索の前にドラフトと掲載前の記事を除外する 7 $query = Board::query(); 8 $query->where(function($query) use($now){ 9 $query->where('status', '!=', 'draft') 10 ->where('published_at','<=', $now) 11 }); 12 13 14//検索条件で抽出 15 $query->where('title','like','%'.$keywords.'%')->orWhere('description','like','%'.$keywords.'%'); 16 $query->orWhere('title','like','%'.$keywords.'%')->orWhere('description','like','%'.$keywords.'%'); 17 18 19 $query->orderBy('created_at', 'desc'); 20 $boards = $query->paginate(20); 21 22//省略
この際に前段の
PHP
1 $query->where('status', '!=', 'draft') 2 ->where('published_at','<=', $now)
が効いておらず、$boardsの中にドラフトと掲載前の記事も含まれてしまします。
キーワードでの検索の処理の条件の方は効いており抽出されています。
下記のような記述でも結果は同じでした。
PHP
1$query = Board::query(); 2$query->where('status', '!==', 'draft'); 3$query->where('published_at','<=', $now);
暫定処理で表示したくないコンテンツはviewのbladeの方で
PHP
1@forelse($post_boards as $post_board) 2@if($post_board->status != 'draft') 3@if($post_board->published_at <= $now) 4//省略 5<li> 6 {!! mb_strimwidth( strip_tags( $board->description ), 0, 155, '...', 'UTF-8') !!} 7 <a href="{{ route('boards.show', ['id' => $board->id]) }}">[ReadMore]</a> 8</li> 9//省略 10@endif 11@endif 12@endforelse
というような処理で非表示にしているのですが、
$boardsの抽出のところでできれば制御したいと思っています。
whereやorWhereの使い方の基本的なところが理解できていないのかもしれませんが、
ヒントをいただければ幸いです。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/15 07:36