前回は、マイグレーションを使って、Articlesテーブルを作成しました。今回はMVCパターンのモデルを作成し、モデルを通して、DBのデータを操作を行います。
なお、Laravelでは DB とモデルオブジェクトを対応付ける機能を Eloquent と名付けています。Eloquent の機能を継承し、ビジネスロジックを加えたクラスがモデルです。
モデルの作成
artisan を使ってモデルを作成します。
テーブル名は複数形(Articles)で命名しましたが、モデル名は単数形(Article)で命名するのが慣例となっています。ご注意を。
php artisan make:model Article
モデルファイルは app ディレクトリの直下に作成されます。
app └── Article.php
<?php // app/Article.php namespace App; use Illuminate\Database\Eloquent\Model; class Article extends Model { // }
EloquentのModelを継承しているだけで、中身が空っぽのクラスが作成されました。なんだか不思議ですが、これだけでArticlesテーブルを操作することが出来ます。
Articles テーブルのスキーマの復習
モデルの操作を行っていく前に、前回作成した Articlesテーブルのスキーマを復習しておきます。
CREATE TABLE "articles" ( "id" integer not null primary key autoincrement, "title" varchar not null, "body" text not null, "published_at" datetime null, "created_at" datetime not null, "updated_at" datetime not null );
id はデータベースによって自動採番されるようになっています。
created_at, updated_at はタイムスタンプと呼ばれ、Eloquent が自動でセットしてくれます。
title, body, published_at はユーザによって設定される項目です。
モデルの操作
tinker を使って、Articleモデルを操作してみます。
tinker は Laravel アプリケーションと対話的にやりとりする為のツールです。ちょっと動きを試したいとき等に大変便利です。
では、tinker を実行します。
php artisan tinker
ここ以下は tinker上での操作です。
Articleの作成と保存
>>> $article = new App\Article() => App\Article {#2861} >>> >>> $article->toArray() => [] >>> >>> $article->title = 'はじめてのタイトル' => "はじめてのタイトル" >>> >>> $article->body = 'かくかくしかじか' => "かくかくしかじか" >>> >>> $article->published_at = Carbon\Carbon::now() => Carbon\Carbon @1535050359 {#2864 date: 2018-08-24 03:52:39.156431 Asia/Tokyo (+09:00), } >>> >>> $article->toArray() => [ "title" => "はじめてのタイトル", "body" => "かくかくしかじか", "published_at" => Carbon\Carbon @1535050359 {#2864 date: 2018-08-24 03:52:39.156431 Asia/Tokyo (+09:00), }, ] >>> >>> $article->save() => true >>>
- Article クラスを new することで、$article 変数に空の Article を作成。
- title, body, published_at に値をセット。
- published_at には Carbon クラスで取得した現在時刻をセット。
- save() で DBにデータを保存。
Article クラスにはメンバ変数やアクセサメソッド(geter, setter)が定義されていないのに、値をセットすることが出来ました。
実は、Eloquentでは、PHPのマジックメソッド__set(), __get() を使ってテーブルの項目に対応するメンバー変数へのアクセスを可能にしています。
Article を全件表示
>>> App\Article::all()->toArray() => [ [ "id" => 1, "title" => "はじめてのタイトル", "body" => "かくかくしかじか", "created_at" => "2018-08-24 03:54:26", "updated_at" => "2018-08-24 03:54:26", "published_at" => "2018-08-24 03:52:39", ], ] >>> >>> exit
Articleクラスの all()で Article テーブルのデータを全件取得しました。データが1件だけ追加されていることが確認できます。
長くなってきたので、モデルの操作は一旦ここで中段します。次回につづく。
まとめ
以下のことが出来るようになりました
- モデルの作成
- モデルのインスタンス作成とDBへ保存
- DBからテーブルのデータを全件取得