質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.60%

1つのbladeでclick時一覧表中身は表示せず、検索されたら検索結果を表示したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,164

score 15

PHP初心者です

表題の通りなのですが、
1つのBladeでクリック時(サイト導入時)はDB一覧を表示させず、
検索ボックスより検索した時に始めてデータが出てくるようにしたいです。
ただ一覧を出すだけならできたのですが、最初は何も表示させず、検索した後に
SQLよりデータ抽出するなんてどうやって表示のタイミングかえるんだよ~~って感じで詰まってます。
(都合によりページを増やす事はできないのです。。。。)
そこでお力を借りれればと思います。
書き方が悪いなどめちゃくちゃあるかと思うのですが、ヒントだけでも戴きたいです。お願いいたします。

特にControllerのindex()内の$kmaster に下メソッドgetQueryの処理結果を入れればいけそうな気もするんですが、
returnする方法もあいまいです。。教えてください、

Controller

<?php
class BmasterListController extends Controller {

    public function index() {
        $query = new stdClass();
        $b_code= 'b_code';//部署コード
        $tenpo_code= 'tenpo_code';//店舗コード
        $jname = 'sname'; //部署名
        $name = 'name';  //店舗名


         $kmaster ->getQuery($b_code, $tenpo_code, $name);

        //view に kmasterListを返す
        return view('kmasterList', ['kmaster' => $kmaster])->with('resultcount', $resultcount);
    }

    //検索
        private function getQuery($b_code,$tenpo_code,$name) {
        // クエリ生成(部署コードと部署名を取得するためのクエリ)



        $query = DB::table('t_class')
                ->select('t_class.b_code', 'b_school.name as sname', 't_class.tenpo_code', 't_class.name')
                ->join('b_school', 't_class.b_code', '=', 'b_school.b_code');


        //検索条件に部署コードが存在する場合
        if (!empty($query->b_code)) {
           $query->where('b_code', 'like', '%' . $query->b_code. '%');
        }
        // 検索条件に店舗コードが存在する場合
        if (!empty($query->tenpo_code)) {
            $query->where('tenpo_code', 'like', '%' . $query->tenpo_code. '%');
        }
         // 検索s条件に店舗名が存在する場合
        if (!empty($query->name)) {
            $query->where('name', 'like', '%' . $query->name . '%');
        }        

        $kmaster = $query->get();
        // 表示件数を取得
        $resultcount = $kmaster->count();

        //queryに bmasterListを返す
        //return $query('bmasterList', ['kmaster' => $kmaster])->with('resultcount', $resultcount);
        return $query;

Blade

@section('content')
<div id="site_content" class="kmaster">
    <div id="content">
        <h1>店舗マスタ・一覧</h1>
        <div class="stouroku">新規登録は<a href="{{ route('bmasterRegist.index') }}"> こちら</a></div>
        <div id="ju_search" class="search">
            <form action="{{route('bmasterList.index')}}" method="post">
                <!-- CSRF保護 -->
                @csrf
                <tbody>
                    <tr>
                        <td> 
                            <p>部署     {{session(config('constants.SESSION_KEY_SCHCODE'))}} {{session(config('constants.SESSION_KEY_SCHNAME'))}}</p>
                        </td>
                     </tr>
                    <tr>
                    <td>    
                        <p>店舗コード <input type="text" name="kcode" class="cell clear"> 
                            店舗名 <input type="text" name="kname" class="cell clear"></p> 
                    </td>

                </tr>
                </tbody>
                </table> 
                <div class="buttons">
                    <p><input class="button  bulu" type="submit" name="submit" value="検索"></p>
                    <p><input  id="inputClear" class="button green" type="reset" name="reset" value="クリア"></p>
                </div>
            </form>
        </div>
        <div id="ju_List" class="List2">
            <p>({{ $resultcount }}件表示)</p> 
            <table>
                <tr>
                    <th>
                        部署コード
                    </th>
                    <th>
                        部署名
                    </th>
                    <th>
                        店舗コード
                    </th>
                    <th>
                        店舗名
                    </th>
                    <th>
                    </th>
                    <th>
                    </th>
                </tr>
                @foreach ($kmaster as $val)
                <td>{{ $val->tenpo_code}} </td>
                <td>{{ $val->sname}} </td>
                <td>{{ $val->b_code}} </td>
                <td>{{ $val->name}} </td>
<td>
                        <a href="{{ route('bmasterList.delete', $val->tenpo_code) }}" onclick='return confirm("削除してもよろしいですか?");'>削除</a>
                    </td>
                @endforeach
            </table>
        </div>
    </div>
</div>

特にreturn文で$queryを返しているのですが、ちゃんと帰っているか。。。

追記 Route

// 店舗マスタ・一覧
// 初期表示
Route::get('/bmasterList', 'BmasterListController@index')->name('bmasterList.index');
// 検索
Route::post('/bmasterList', 'BmasterListController@index')->name('bmasterList.index');
// 削除
Route::get('/bmasterList/{tenpo_code}', 'BmasterListController@delete')->name('bmasterList.delete');

version

php7.3
laravel 5.7
MySQL 5.7

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/03/26 15:46

    ルーティング部分もコード提示いただけますか?

    キャンセル

  • gomora

    2019/03/26 15:52

    Controller のindex()ないの $kmaster ->getQuery($b_code, $tenpo_code, $name);
    の部分なのですが、いまいち理解しておらずエラーに対応する為このような表現になってしまっております。
    (ここのあたりが特に意味わからん)

    ルートファイル追記しますです。

    キャンセル

  • m.ts10806

    2019/03/26 20:20

    煽り文句は不要かと<激ムズ
    ちなみにLaravelのバージョンとphpのバージョンをマイナーバージョン含めて追記いただけますか?
    ヒント回答だけでも良いのでしょうけど、できればバージョンに沿った形にしたいので。

    キャンセル

  • gomora

    2019/03/27 08:28

    バージョン情報の追記をいたしました

    キャンセル

回答 1

checkベストアンサー

0

簡単に言うと「getとpostで実行するメソッドをわける」でしょうか。
get時というのは単にアクセスしたときなので「検索はされていない」という状態かと思います。特に今回はpostで送信しているわけですよね。
メソッドをわけて同じビューを参照するようにするとコードがスッキリします。

もちろん「同じメソッドを参照する」でもできないことはないですが、get時に何も処理させないのに通すのは変な感じですよね。

あとはフラグを1つ、渡してください。getかpostかが判断できればOKです。

ルーティング

// 初期表示
Route::get('/bmasterList', 'BmasterListController@index')->name('bmasterList.index');
// 検索
Route::post('/bmasterList', 'BmasterListController@search')->name('bmasterList.index');


コントローラ

<?php
class BmasterListController extends Controller {

    public function index() {

      //中略

      return view('kmasterList', ['kmaster' => [],'search_flg' => false])->with('resultcount', 0);
    }
    public function search(Request $request) {
      //入力情報は$request->input()からとるべきでは
      //中略
      $kmaster = $this->getQuery($b_code, $tenpo_code, $name);
      //中略

      return view('kmasterList', ['kmaster' => $kmaster,'search_flg' => true])->with('resultcount', $resultcount);
     //※ $resultcountはちゃんとgetQuery()から返さないといけないのでは withって使い方あってるかな・・・
    }

で、ビュー側では下記のようにする。

@if (!$search_flg)

<p>検索条件を入力して「検索」ボタンを押してください。</p>

@else
  @if($resultcount === 0)
    <p>検索条件に合致する情報がありません。</p>
  @else
    <table>
    //中略
     @foreach ($kmaster as $val)
       <tr>
    //中略
       </tr>
    @endforeach
    </table>
  @endif
@endif

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/27 13:44 編集

    私が提示したリファレンスは読まれましたか?
    「Laravel 5.7 HTTPリクエスト」のほう。
    POSTで送信された情報の取得の仕方です。今回は検索条件をPOSTで送信しているわけですからその情報を取得する必要があるわけです。
    質問のコードを見る限り、どこにも検索条件を取得しているところがなかったため、補足として書いています。

    キャンセル

  • 2019/03/28 07:30

    POST取得できました。ありがとうございます。
    結果的には$resultcountを用いてindex()時はカウント0にして何も表示させず、検索ボックス(サーチ)というリクエストメソッドのを経由する事でカウント=検索結果として表示させる事ができました。
    ヒントをいただきありがとうございました。

    キャンセル

  • 2019/03/28 08:11

    解決に繋がったようで何よりです

    キャンセル

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

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る