🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1881閲覧

laravel カテゴリ検索時、絞り込み用のSQLが作成できません。

nikoniko

総合スコア11

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/09/26 22:03

編集2019/09/26 22:59

開発環境

  • laravel6.0.3
  • php7.2.22
  • mysql8.0.17
  • Mac

laravel初心者です。
カテゴリ検索時、SQLでcategory_idで絞り込みができずに、全件表示されてしまいます。
Controller内に、category_idの値は入ってきているのですが、
where句以下のSQLが読み込まれません。
SQLの順序をwhere句を最初に持ってきて、paginateを最後に持ってくるように変えてみたりしたのですが、うまくいかず、困っています。

どのようにすれば、where句をつけて絞り込むことができるのか、ご教授願います。

Controller

1class RecordsController extends Controller 2{ 3 //初期表示用関数 4 public function index(Request $request) 5 { 6 //カテゴリ絞り込み検索表示用 7 $categories = DB::table('categories')->distinct()->get(); 8 9 //一覧表示用 10 $records = Record::latest()->paginate(10); 11 $records->load('category'); 12 13 $category_list = $request->category_list; 14 15 //カテゴリ検索時 16 if(isset($category_list)){ 17 $records->where('category_id', '=', $category_list); 18 } 19 20 return view('records.index', [ 21 'categories' => $categories, 22 'records' => $records 23 ]); 24 } 25  ・ 26  ・ 27  ・ 28}

View

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>チリツモ</title> 6 <link rel="stylesheet" href="/css/styles.css"> 7 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> 8 <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> 9 <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> 10 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> 11</head> 12<body> 13 <div class="container"> 14 <h1>チリツモ</h1> 15 <section class="header_menu"> 16 <a href="{{ action('RecordsController@create') }}">今日の記録</a> 17 <a href="{{ action('CategoriesController@maintenance') }}">カテゴリ一覧</a> 18 </section> 19 20 <section class="records_list"> 21 <form action="{{ action('RecordsController@index')}}" method="POST"> 22 @csrf 23 カテゴリー名<select name="category_list"> 24 <option value="">選択してください</option> 25 @forelse($categories as $category) 26 <option value="{{$category->id}}" @if (old('category')==="{{$category->id}}") selected @endif >{{$category->name}}</option> 27 @empty 28 <p>カテゴリーがありません。</p> 29 @endforelse 30 </select> 31 <input type="submit" value="検索" name="search_btn"> 32 <input type="hidden" name="_token" value="{{csrf_token()}}"> 33 </form> 34 35 @forelse ($records as $record) 36 <ul> 37 <li>{{ $record->category->name }}</li> 38 <li>{{ $record->time }}時間</li> 39 <li>{{ $record->created_at }}</li> 40 <form method="POST" action="/records/delete/{{$record->id}}" > 41 @csrf 42 43 <input type="submit" value="削除" name="del_btn" onclick='return confirm("削除してよろしいですか?");'> 44 </form> 45 <div class="progress"> 46 <div class="progress-bar bg-warning" role="progressbar" style="width: 75%" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100"></div> 47 </div> 48 </ul> 49 @empty 50 <p class="error">記録がありません。</p> 51 @endforelse 52 </section> 53 {{-- ページネーションバー--}} 54 <span class="pagination">{{ $records->links() }}</span> 55 </div> 56 <script src="/js/main.js"></script> 57</body> 58</html>

Model

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Category extends Model 8{ 9 protected $fillable = ['id', 'name']; 10 11 //学習記録を取得 12 public function records(){ 13 return $this->hasMany('App\Record'); 14 } 15} 16 17

Model

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Record extends Model 8{ 9 10 protected $fillable = [ 11 'id', 12 'category_id', 13 'time' 14 ]; 15 16 //このカテゴリを所有する学習記録を取得 17 public function category(){ 18 return $this->belongsTo(Category::class, 'category_id'); 19 } 20} 21 22} 23

Route

1Route::match(['get', 'post'], '/', 'RecordsController@index');

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mix-peach

2019/09/27 03:21

>SQLの順序をwhere句を最初に持ってきて、paginateを最後に持ってくるように変えてみたりしたのですが、うまくいかず 試したコードと、どううまくいかなかったのか、追記をお願いします。
nikoniko

2019/09/28 02:25

以下のように変えてみたのですが、 Call to undefined method Illuminate\Database\Eloquent\Builder::load()が表示され、上手くいきませんでした。     $record = Record::latest(); if(isset($request->category_list)){ $records->where('category_id', '=', $request->category_list); } $records->paginate(10); where句以下を$recordsに代入していなかったことが原因だったと理解できました。ありがとうございました。
guest

回答2

0

ベストアンサー

php

1 2 public function index(Request $request) 3 { 4 $categories = Category::query()->distinct()->get(); 5 6 $records = Record::with('category') 7 ->when($request->category_list, function($query) use ($request) { 8 $query->where('category_id', '=', $request->category_list); 9 }) 10 ->latest() 11 ->paginate(10); 12 13 return view('records.index', compact('categories', 'records')); 14 }

->where('category_id', '=', $request->category_list) このクエリ条件が正しいなら、category_list という命名はまずいと思います。
本当にLIST(配列)なら、
->whereIn('category_id', $request->category_list) であるはず。

投稿2019/09/27 03:55

編集2019/09/27 05:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikoniko

2019/09/28 02:44

回答ありがとうございます! if文ではなく、when句を使用する方法もあったのですね。 また、命名に関して、category_listという命名だと、配列を想起させてしまうのですね。 categoryに変更しようと思います。 回答の修正方法に加えて、命名についてもご指導いただいたので、ベストアンサーにさせていただきます! ありがとうございました!
guest

0

paginateですが、paginateメソッドを呼んだ時点で(getもそうですが)
SQLの実行結果」となるため、whereでの絞り込みができません。
collectionで行える範囲での絞り込みは可能ですが
例えば全100件中10件をpaginateしてからの絞り込み、となるためページごとに件数のばらつきが発生します。

$records = Record::latest(); if ($request->category_list) { $records = $records->where('category_id', $request->category_list); } $records = $records->paginate(10);

投稿2019/09/27 03:48

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikoniko

2019/09/28 02:31

回答ありがとうございます! ページごとに件数のばらつきが生じてしまう点、勉強になりました。 ご指導いただいたコードに修正したところ、うまくいきました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問