(2022/4/4)Laravel 17日目 掲示板/ログ出力/検索処理
長いことお世話になっております。
Laravelで掲示板の続き。検索がうまく動作してなかった。
■ログ出力
検索時に実際どんな文字列で検索しているか、ログ出力したい。
通常ログはinfo関数でいけるそう。
出力先は storage\logs
検索してみると、
local.INFO: search {"message":null}
検索文字列が取得できていない?
・・検索フォームのコントロール名の綴りが間違っていた。
原因が見つかったのでよしとする。
検索も無事できました。
■LIKE検索
ところで中間一致で検索する際に以下の処理で検索文字列を編集しているわけですが
'%' . addcslashes($request->search_message, '%_\\') . '%'
addcslashesとは何なのか。'%_\\'とは何者なのか。素通りしてもよいのだがちょっと確認しておく。
お前らのLike検索は間違っている (QueryBuilder/Eloquent) - Qiita
要するに中間検索する際は%で検索文字を囲むんだけども、
その中にワイルドカード文字(%)やメタ文字(_, \)を含む場合は1文字ずつ前に\をつけてあげないといけなくて、addcslashesはそれを関数内でやってくれるということかな。LIKE検索するときは単純に検索文字列指定せずに一加工加えてからパラメタに渡すと覚えておこう。
■テーブルカラム追加
テーブルの列を変更する際にはマイグレーションから実行する。
今回はスレッドの作成者しかスレッドを削除できないようにするのが目的で、
作成者ユーザをテーブルに項目追加する。
$php artisan make:migration add_user_identifier_to_threads_table
関数を編集。user_nameの後ろにuser_identifier列を追加
public function up(){
Schema::table('threads', function (Blueprint $table) {
$table->string('user_identifier', 20)->after('user_name');
});
}
マイグレーション実行
$php artisan migrate
項目追加・・されない。
Laravelでmodelを変更してmigrateしても反映されない場合の対応 | ゆきねこ
キャッシュクリア、再構築しても変わらない。
よくわからんが、とりあえずテーブル作成するマイグレーションファイルの方に項目追加して、項目追加のファイルを退避して再構築したら追加された。
スッキリしないけど、まぁよし。
■ユーザ識別子の生成
ページ表示時に、ユーザ識別子とユーザ名をセッションにセットする。
認証系やりたかったのでありがたい。
今回はユーザ管理はせず簡易版となる。
ThreadController.php
-public function index()
+public function index(Request $request)
// ユーザ識別子をセッションに登録(なければ生成)
if($request->session()->missing('user_identifier')){
session(['user_identifier' => Str::random(20)]);
}
// ユーザ名をセッションに登録(なければゲスト)
if($request->session()->missing('user_name')){
session(['user_name' => 'Guest']);
}
store関数
// 入力したユーザ名をセッションに登録
session(['user_name' => $request->user_name]);
index.blade.php
・入力フォーム内にユーザ識別子のhidden項目を追加
<input type="hidden" name="user_identifier" value="{{session('user_identifier')}}">
・ユーザ名のデフォルトにセッション値を表示
-<input class="ms-2 border rounded px-2 input-sm w-25" type="text" name="user_name" required>
+<input class="ms-2 border rounded px-2 input-sm w-25" type="text" name="user_name" value="{{session('user_name')}}" required>
ここで試しに動かしてみたところ、
Class "App\Http\Controllers\Str" not found
Str::randomでランダムな文字列を生成する関数が認識されていない様子。
【Laravel】ランダムな文字列を生成できるStr::randomメソッドについて解説します | たいらのエンジニアノート
use Illuminate\Support\Str;
↑の宣言が必要だった。
■削除ボタンの表示切替
@if ($thread->user_identifier == session('user_identifier'))
@endif
↑で囲む
スレッドを作成したユーザ識別子と、セッションのユーザ識別子が一致する場合のみ削除ボタンを表示する。
■確認
自分で作成したスレッドは削除ボタンが表示される。
時間が経つとセッションが切れて識別子が変わるので、削除ボタンが非表示となる。
これで参考にさせていただいたページの掲示板は一通り完成!
次はユーザ管理あたりですかね。
↓欲しいけどちょっとお高い。