Laravel投稿サイト構築.49 マイグレーションのロールバック/外部結合
前回、投稿への返信もログインしているユーザのみできるようにした。
返信データもユーザ名で持つのではなく、ユーザIDで持つようにした。
■登録ユーザじゃなくても返信は可能にしたい
無名の投稿サイトを公開したとして、
全てゲストユーザが書き込めるようにしてしまうと荒し放題なので、
投稿も返信もメール認証まで済んだユーザしか許可しないようにしたのだが、
どちらもメール認証ありきにしてしまうと敷居が高くなってしまうだろう。
ということで、投稿に対しては誰でもコメントできるようにしたい。
■マイグレーションのロールバック
返信用テーブルのユーザ名を削除してユーザIDを追加した。
これを一旦戻してユーザID追加のみにする。
で、未認証の方が返信したい場合は返信者の名称と内容を入力するようにする。
マイグレーションファイルのロールバック内容を記述する必要がある。
public function down()
{
Schema::table('replies', function (Blueprint $table) {
$table->string('user_name');
$table->dropColumn('user_id');
});
}
便利なんだかアナログなんだかわかりませんが。
$php artisan migrate:rollback
■修正したマイグレーションを実行
ロールバックしたファイルを修正して、ユーザIDの追加のみにする。
■返信部分の修正
bladeを修正して、メール認証が済んでいるユーザであれば返信のユーザ名欄は非表示にする。
そうでなければ返信ユーザ名を表示する。
@if( auth()->check() && auth()->user()->hasVerifiedEmail() )
@else
<input class="border rounded px-2 flex-initial" type="text" name="user_name" placeholder="UserName" value="{{session('user_name')}}" required>
@endif
コントローラで返信情報登録時、
認証ユーザならユーザIDを設定して、そうでなければユーザIDは0を設定してユーザ名に入力したユーザ名を設定する。
if( auth()->check() && auth()->user()->hasVerifiedEmail() ){
$form['user_id'] = auth()->id();
} else {
$form['user_id'] = 0;
}
モデルで返信情報一覧を出力する際に、
ユーザIDでユーザマスタを取得できなければ、返信者の名称を表示する。
$replies = Reply::select([
'r.id as rep_id',
'r.created_at',
'r.message',
'r.rep_type',
'r.user_name as rep_name',
'u.name as user_name',
])->from('replies as r')
->where('thread_id', [$this->thread_id])
->leftjoin('users as u', function($join) {
$join->on('r.user_id', '=', 'u.id');
})
->orderBy('r.created_at', 'desc')
->get();
foreach($replies as $rep1){
if( empty( $rep1['user_name'] ) ){
$rep1['user_name'] = $rep1['rep_name'];
}
}
外部結合はそのまんまleftjoin
SQLServerでいうところのISNULLが分からず、ループでemptyでNULL判定している。
・ゲストユーザの場合
・認証ユーザの場合
最善ではなさそうだがとりあえず進んではいる感じ。
続く