こんにちは。きむちゃん。です。
突然ですがみなさん。
研修してますか?
僕はしてます(してました)。
研修といえば、LaravelでTwitterを模倣したWebアプリとか作りがちですよね、わかるわかる。
そうなると、ユーザとツイートが紐づいて大変だ!中間テーブルの出番だ!
と、いうことで中間テーブルをバンバン使います。
今回は、その際に陥りがちな初心者あるあるな記法ミスについてです。
はい、サクッと説明します。
hoge.php
$tweets = DB::table('tweets')
->where('owner_id', $user->id)
->orderBy('created_at', 'desc')
->paginate(20);
hoge.php
$tweets = Tweet::whereIn('owner_id', $user->id)
->orderBy('created_at', 'desc')->paginate(20);
二つのコード、どちらも取れる情報自体は同じように見えます。
しかし、View側で$tweetsから紐づいているユーザ情報とかを中間テーブルを使って、
hoge.blade.php
{{$tweet->user->name}}
とかで取るときに重大な違いがあります。
先のDBファサードを使って取得したツイートデータは、Tweetモデルを参照していないため、そこから中間テーブルへのアクセスができないただのデータになります。
Tweet::のEloquentモデルから取って来てる方は、モデルなので参照できます。
はい、何が言いたいかというと、
Webアプリはどうせ中間テーブルのオンパレードなんだから、DBファサードはなるべく使わずに、ちゃんとEloquentモデルからデータを持ってこような!!実装機能が増える未来の自分のために!!!
です。
最初のうちは、導入が手っ取り早いDBファサードで取ってくる人が多いのではないか??と思ってお昼ご飯食べながらだらだらと書きました。ので、ご指摘等いただけると幸いです。
初めて、Webアプリとかやる人がこの記事を見て気をつけてくれると恐悦至極です。
それでは。