##テーブル構造
・usersテーブル
id | username | user_img
・itemsテーブル
item_id | user_id | title | content
##結合
コントローラファイル内の記述。
前のページから受け取ったitem_idを取得して、複数のテーブルからデータを抽出したい場合。
例えば、ECサイトのTOPページにて商品クリックされる->商品詳細画面を表示 みたいな動きをイメージ。
public function index(Request $request){
$items = Item::select()
->leftjoin('users','users.id','=','items.user_id')
->where('item_id',$request->item_id)
->get();
return view('itemIndex', ['items'=>$items]);
}
上から順に。
・selectメソッドで、itemsテーブルを呼び出し
・usersテーブル、usersテーブルの中のidと、itemsテーブルのuser_idが等しいレコードをガッチャンこする。
・whereメソッドで、item_idがイコールitem_id(requestは前のページからPOSTでvalueを受け取っている)
・取得して$items(<-変数名なので自由に変えれる)へ入れる。
・itemIndexページ(ページ名なので自由に変えれる)を表示して、itemsとして変数を渡す。
そうするとitemIndexのページ内で、itemsとして全てのカラムを利用することができる。
例えば、itemIndex.blade.php内で、こんな感じに使う。
<p>商品タイトル:{{ $items->title }}</p>
<p>内容:{{ $items->content }}</p>
<p>出品者:{{ $items->username }}</p>
<p>プロフィール画像:{{ $items->user_img }}</p>
ちなみに、コントローラの記述は特にきちんとインデントを揃えて記述することをお勧めする。
様々なテンプレートでは、アロー(->)が横続きになって一行で記述されているやつも多い。
最初そのせいでコードの意味がわからなかったが、改行したらすぐに明快になった。
上記のコードを見てもらったら想像できるとおり、テーブルはもっと複数結合することも可能。
##おまけ
ちなみに、今回「users」テーブルと「items」テーブルのカラム名は全てユニークにしている。
通常は、itemsテーブルの
"item_id"
これを単なる"id"と名づけたいところ。
しかし、これでやってみたところ、
テーブル結合した後に"id"が二つ重複して存在することになるようで、
"id"をうまく取得できなかった。
なので、今回はカラム名をユニークにしている。
テーブルが多くなるのとこのやり方は汎用性に欠けてくるので最適解ではないはず。
idがかぶる時の対処法は、別記事にて調べてみてください。