【Laravel】Modelからデータベースにアクセスしたい!
PHPバージョン:7.1.14
Laravelバージョン:5.7.9
今回はMVCのモデルについてです!
MVCのCであるControllerの記事はこちら
MVCのVであるViewの記事はこちら
前回まででDBのテーブル作成(Migration)とデータ登録(Seeding)を行いました!
またArticleのControllerとViewも作成しました!
というわけで今回は、モデルからデータベースにアクセスしたいと思います!
モデルを作成する
まずはartisanコマンドでArticleという名前のモデルを作成します!
$ php artisan make:model Models/Article Model created successfully.
こちらのコマンドでモデルを作成することができます。
Modelsの部分はディレクトリを表しています。
Laravelはデフォルトではモデル用のディレクトリは用意しておりません。
(モデルの定義がユーザーによって大きく違うため作成箇所はユーザーに委ねている。)
さてそれではArticleモデルを確認してみましょう!
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Article extends Model { // }
app>Models>Article.php
Modelクラスを継承したArticleという名前のクラスのみで、シンプルです。
モデル名はデータベーステーブルの単数形にすると、
Laravelが自動的に判定してDBとModelを繋ぎます。
("articles"テーブルなら"Article"モデル)
もしくは"$table"変数にデータベーステーブル名を指定すると、
ModelとDBを繋げることができます。
Articleクラスが継承しているModelクラスの変数を
オーバーライドする形となります。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Article extends Model { protected $table = 'special_articles'; }
上のようにすると、
DB内にある'special_articles'テーブルとArticleモデルが繋がります。
以上でModelを利用してデータベースにアクセスすることができます。
ArticleControllerを編集
続いて以前作成したEventControllerを編集します!
<?php namespace App\Http\Controllers; // ***** 開始 ***** use App\Models\Article; // ***** 終了 ***** use Illuminate\Http\Request; class ArticleController extends Controller { function show() { // ***** 開始 ***** $articles = Article::all(); return view('article.show', ['articles' => $articles]); // ***** 終了 ***** } }
app>Http>Controllers>ArticleController.php
まずはuse宣言に先ほど作成したArticleモデルのパスを記述します。
これを忘れるとController内でArticleモデルを使うことができません。
続いてshowメソッドです。
Articleモデルの静的メソッドとして、allメソッドを使っています。
allメソッドはarticlesテーブルに登録されている全レコードを取得します。
Article::allメソッドはLaravelのEloquentという機能の中に用意されています。
Eloquentのおかげで、バックグラウンドをきにすることなく
静的メソッドのように使うことが出来ます。
Eloquentについては別記事でご紹介する予定です。
最後にviewメソッドです。
第一引数に'article.show'と書かれているのはディレクトリ構成を表しています。
resources>view以下にarticleディレクトリを作成し、
その下にshow.blade.phpファイルを作成しましょう。
第2引数には取得したarticlesデータを配列に渡します。
Viewを編集
続いてViewを編集します!
<!doctype html> <html> <head> <title>Article/Show</title> </head> <body> <h1>Article/Show</h1> @foreach($articles as $a) <p>{{$a->title}} : {{$a->body}}</p> @endforeach </body> </html>
resources>views>article>show.blade.php
渡されたarticles配列データを@foreachで取り出しています。
Laravelのbladeはこのようにforeach文などphpの機能を簡潔に記述することができます。
routeを編集
最後にrouteであるweb.phpファイルを編集して終了です!
<?php Route::get('/', function () { return view('welcome'); }); // ***** 開始 ***** Route::get('article/show', 'ArticleController@show'); // ***** 終了 *****
routes>web.php
MigrationとSeedingによってMySQLに登録したデータをModelで取り出し、
Viewで表示することに成功しました!
本日はここまでです、ありがとうございました〜