今日の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への画像アップロード
画像アップロード前に画像サイズの圧縮