今回はCRUDのRead(読み取り)を実装し、今まで投稿された記事を一覧表示できるようにする。
コントローラ追記
Articleコントローラに下記の内容を追記する。
public function index()
{
$articles = Article::all();
return view('article.index', ['articles' => $articles]);
}
indexアクションはこのような流れになる。
-
Articleクラスのallメソッドで全てのレコードを取得し、$articlesへ代入する。 -
$articlesを'article.index'ビューへ配列形式で渡す。 - ビューの中で
$articles、つまり取得したレコードを使用できるようになる。
このallメソッドは、元はCollectionクラスのメソッドらしい。そして取り出したレコードはCollectionクラスのオブジェクトとして利用できる。
公式ドキュメントより(一部抜粋)
getメソッドであれリレーションによるものであれ、Eloquentが複数のレコードをリターンする場合Illuminate\Database\Eloquent\Collectionオブジェクトが返されます。EloquentコレクションオブジェクトはLaravelのベースコレクションを継承しているので、Eloquentモデルの裏にある配列をスムーズに操作するために継承した多くのメソッドがもちろん使用できます。
Collectionクラスを使用しているのがEloquentだから、EloquentのクラスであるArticleクラスのインスタンスとして扱うことができるのか・・・?その辺りの繋がりが正直よく分からない。
ルーティング設定
ユーザー側からPOSTする情報は無いので、設定するのはGETに対応したルートのみで良い。
Route::get('/article/index', 'ArticleController@index')->name('article_index');
ビュー作成
resources/views/articleディレクトリにindex.blade.phpを作成し、編集する。今回はtableタグを使ってみた。
@foreachディレクティブを使用し、コントローラから渡された$articles(全てのレコード)から1件ずつ$articleインスタンスを取り出し、各プロパティを表示している。
@extends('...layouts.layout')
@section('article_index')
投稿一覧<br>
<table>
<tr><th>ユーザーID</th><th>タイトル</th><th>内容</th></tr>
@foreach($articles as $article)
<tr>
<td>{{ $article->user_id }}</td>
<td>{{ $article->title }}</td>
<td>{{ $article->content }}</td>
</tr>
@endforeach
</table>
@endsection
こちらの記述も忘れずに。
@yield('article_index')
今回はあっさりしているが、ここまで。