じろう

2019年11月02日に参加

学習履歴詳細

[Laravel]課題アプリ作成。部分検索機能実装。まずは本文だけ検索→本文とタイトル→本文とタイトルと記事に紐づくタグも検索できるように。

今日のYWT

やったこと

Travelog

部分検索実装

  • Articleのcontentカラムの内容だけ検索を実装

    • ルーティング作成
    • コントローラ作成
    • navbarに検索バー設置
    • ついでにnavbarのitemを中央よりに
    • コントローラにメソッド追加
    • 検索結果を表示するビュー作成
  • Articleのcontentとtitleを検索できるようにする

    • orWhereを使ってみる
  • Articleに紐付いたTagも検索できるようにする

    • 最初は諦めてたけどorWhereHasで実装できると教えてもらう
  • クエリビルダのwhenを使ってifを消す

  • ついでにloadで発行されるSQLをへらす

わかったこと

検索

最終的なコード

SearchController.php

<?php

namespace App\Http\Controllers;
use App\Article;
use Illuminate\Http\Request;

class SearchController extends Controller
{
    public function search(Request $request)
    {
        $keyword = $request->input;
        $query = Article::query()
            ->when(isset($keyword), function($query) use ($keyword){
                $query
                    ->where('content', 'LIKE', "%{$keyword}%")
                    ->orwhere('title', 'LIKE', "%{$keyword}%")
                    ->orWhereHas('tags',function($query) use($keyword) {
                        $query->where('name', 'LIKE', "%{$keyword}%");
                    });
            });

        $articles = $query->get()->sortByDesc('created_at')
            ->load([
                'user',
                'likes',
                'tags',
                'photos'
            ]);
        return view('search.index', ['articles' => $articles]);
    }
}
  • Article::query()でクエリビルダを発行
  • when(isset($keyword))で、検索ワードがある場合に以下のクエリを発行する
  • orWhereで、or検索的な挙動実装
  • リレーション先のタグモデルも検索するため、orWhereHasを使う

    • クロージャの中で変数を使いたい場合、use($keyword)でok
  • loadでSQLの発行回数を減らせるのはこっちでも一緒

  • viewのほうでは@isset($articles)で条件分岐した

S3への画像アップロード

  • バケットは役割ごとに作る
    • CodeDeployで作ったやつを使いまわそうと思ったけどそれはあんまよくないみたい
  • 画像の圧縮をしないとすぐいっぱいになりそうなのでそれは実装しないといけないみたい

次やること

  • S3への画像アップロード
  • 画像アップロード前に画像サイズの圧縮
PHP
Docker
Laravel

2020年11月01日(日)

6.4時間