[PHP][Laravel5.7]関連する複数テーブルから探せる検索機能を実装してみた。[MySQL]

検索機能実装

今回は検索機能について

どうも皆さんこんにちは。
今回は最近手を染めているPHPのフレームワークLaravelに関する記事です。

タイトルにもあるように今回紹介するのは「検索機能」です。

ただ一点注意して欲しいのは、今回紹介するのは僕が独自で組んだコードになりますので、正直保守性や動作の重さをほとんど考慮できていないという点です。

ですので、詳しい方で「もっと上手く書ける!」という方がいましたらコメント欄などで教えてもらえたら幸いです。。。

検索機能の役割

とりあえず簡単に今回の検索ができることを説明しておきます。

今回は「複数テーブルからキーワードを元にデータを探すことができる」ことを目標にしました。

なんだかよくわかりにくいと思いますので、わかりやすく「食べ物」で考えます。

例えば、「野菜」と検索した時に、参照して欲しいのはカテゴリーテーブルですよね。
でも「人参」と検索した時にカテゴリーテーブルをみてもそんなデータはないので、その時は食べ物テーブルを参照してほしいですよね。

さらに、「栃木県」と調べた時には産地のデータをもつテーブルを見て欲しかったりもしますよね。

なんとなく複数テーブルを跨いで検索したい状況がわかっていただけたでしょうか?

参考までに簡単なDB設計を載せておきます。

db設計

こんな感じで最終的には条件に当てはまるfoodsを見つけるたいわけです。

説明はこんなところにして、次に実際にサンプルコードをお見せします。

(解説はコード内にコメントとして入れておきます。もしそれでもわからない場所があったらブログのコメントやTwitter(@15ito22)で聞いていただければと思います。)

サンプルコード

public static function search($keyword)
    {
       //where('value','like','%'.$keyword.'%')でそのテーブル内の
    //'value'カラムに「$keyword」が含まれるデータを取得します。
      //orWhereのorは「または」を意味します。
       $query1 = Food::where('name','like','%'.$keyword.'%')->orWhere('description','like','%'.$keyword.'%')->get();
     $query2 = Places::where('name','like','%'.$keyword.'%')->get();
        $query3 = Category1::where('name','like','%'.$keyword.'%')->get();
        $query4 = Category2::where('name','like','%'.$keyword.'%')->get();

     //とりあえず空の配列を定義しておきます。
        $food_id_array = [];
     //先ほど取得したデータ達のidを配列に詰めていきます。
        foreach($query1 as $q1){
            if($q1){
        $food_id_array[] = $q1->id;
            }
        }

    //上に同じく
    $place_id_array = [];
       foreach($query2 as $q2){ 
            if($q2){ 
        $place_id_array[] = $q2->id; 
        } 
    }

       //上に同じく
       $category1_id_array = [];
        foreach($query3 as $q3){
            if($q3){
        $category1_id_array[] = $q3->id;
        }
    }
     //上に同じく
        $category2_id_array = [];
        foreach($query4 as $q4){
            if($q4){
        $category2_id_array[] = $q4->id;
        }
    }

     //whereIn('culumn',$array)で$arrayに入っている
     //idとitemsの各カラムのidを照合して取得できます。
        $foods = Food::whereIn('id',$food_id_array)->orWhereIn('place_id',$place_id_array)->orWhereIn('category1_id',$category1_id_array)
        ->orWhereIn('category2_id',$category2_id_array)->get();
        
        //そして最後に取得したデータ達を返してあげる。
        return $foods;
    }

参考:全100種類!Laravel 5.6のコレクション実例

正直少しわかりにくいですね。。。

なんども言ってますが不明な点がございましたら、コメントかTwitter(@15ito22)にお願い致します。

また、もっと良い書き方があるのを知っている神様がいらっしゃればガツガツ指摘していただければと思います。

本気度が高い人は公式リファレンスを読んだ方がいいかもです。

まとめ

とこんな感じで検索機能の紹介は終わりです。

今まではほとんどありませんでしたが、これからはプログラミング関連の記事を頻繁に投稿しようと考えていますので、ぜひまた来てくださいね。

では、最後までご覧いただきありがとうございました。

 


この記事が「ためになった」「面白かった!」と思った人はこちらをクリック!!

にほんブログ村 受験ブログ 大学受験(本人・親)へ

現在、家庭教師の募集も行っています!気になった方、体験授業の申し込みは下の記事からお願いします!(残り1人分の空きしかありません。体験授業のお申し込みはお早めにお願いします。)

家庭教師の無料体験授業実施中!(残り1人)
早稲田大学先進理工学部の家庭教師が大学受験生の生徒を募集します!対応大学は①理系国公立大学:旧帝大、医学部医学科他②私立理工学部:早稲田、慶応、理科大、上智、MARCH他③私立医学部、歯学部、薬学部。対応科目:数学、物理、化学、生物、英語、国語、地理B。対応地域は、東京23区、埼玉県、神奈川県の一部。豊島区南池袋より。