Laravel投稿サイト構築.48 DB抽出でハマった点とテーブル結合再び
前回
投稿者のユーザ名の入力を省略してログインユーザのユーザIDで投稿情報を登録するようにした。テーブルの名称項目を削除してユーザID項目を追加。
再表示関連の修正を行った。
■テーブル抽出時の注意
返信情報が表示されなくなっており、原因は項目追加したことの影響だった。
返信情報の一覧は、投稿データのIDで返信情報を検索する。
Replie::where('thread_id', $this->thread_id)
で検索するように記述したのだが、表示されない。
Replie::get() なら当然全件出力される。
idの型が違うのか? whereの条件の書き方が違う?といじくり倒すこと1時間超。
Replie::where('thread_id', $this->thread_id)->get()
としたら表示された。拍子抜け。
最後にget()なりorderByなりをつけないといけないみたい。多分。
■返信情報もユーザ名称でなくIDで登録
投稿データと返信データはテーブルが分かれていて、
返信書き込み時もユーザ名で登録している。
投稿と同様にユーザIDで登録して、再表示の際はユーザマスタを結合して表示する。
$php artisan make:migration replies_drop_name_add_id --table=replies
マイグレーションファイルの内容も同じく
Schema::table('replies', function (Blueprint $table) {
$table->dropColumn('user_name');
$table->bigInteger('user_id');
});
$php artisan migrate
■返信情報の表示
返信情報取得部分を
Replie::where('thread_id', $this->thread_id)
からユーザマスタを結合して
$replies = Reply::select([
'r.id as rep_id',
'r.created_at',
'r.message',
'r.rep_type',
'u.name as user_name',
])->from('replies as r')
->where('thread_id', [$this->thread_id])
->join('users as u', function($join) {
$join->on('r.user_id', '=', 'u.id');
})
->orderBy('r.created_at', 'desc')
->get();
に修正
表示は確認できたので、返信登録時のユーザ名入力を省略するための修正
bladeのユーザ名欄を削除して、controllerの登録関数を修正。
$form['user_id'] = auth()->id(); を追加
確認できました。
■まとめ
進捗は理想の速度の10%ぐらいか・・?
1日でやりたいことを1週間ぐらいかけてやってる気がするが。
ユーザ登録画面がデザインが崩れているので、それの調整と、
前から気になってる管理者権限の実装。
メール登録もMailTrapでテスト設定なので実際に登録してもらおうとするとメールサーバの設定が必要。
それができたら最低限の投稿サイトとして公開してそこからやりたいことを実装していきたい所存。
いつになるやら
続く