[laravel8] 記事Modelとマイグレーション
ここからは今回作成するブログのの記事のModelとそのマイグレーションを作成していきます。
マイグレーション
ブログの記事を格納するpostsテーブルを作成するマイグレーションを作成します。
マイグレーションのファイルを作成するコマンド
$php artisan make:migration (マイグレーション名)
マイグレーション名は一般的には (動詞)_(テーブル名)_table のように書きます。ここではpostsテーブルを作成するので以下のようにコマンドを書きます。
$php artisan make:migration create_posts_table
$php artisan make:migration create_posts_table
Created Migration: 2021_05_07_111050_create_posts_table
$
コマンドが実行されると、
database/migrations/
のディレクトリの下に新規のマイグレーションファイルが作成されています。
database/migrations/2021_05_07_111050_create_posts_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
}
laravelはコマンドからテーブル名を推測し
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
postsテーブルをcreateするスキーマを作ってくれています。
$table->id(); ユニークID ここではブログのIDとしても使われます。
$table->timestamps(); created_at(作成日時)とupdated_at(更新日時)カラム
ブログの記事を格納するテーブルの構造は以下のようにします。
・タイトル title
・記事の抜粋 excerpt
・本文 body
・公開日時 published_at
これらの情報を生成されたマイグレーションファイルに追加していきます。
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('excerpt');
$table->text('body');
$table->timestamps();
$table->timestamp('published_at')->nullable();
});
stringだと255文字までしか保存できなく抜粋は長くなることもあるので、textにしました。またpublished_atはNULL値を許容するようnullableにしています。
ではコマンドを実行してテーブルを追加しましょう。
$php artisan migrate
$php artisan migrate
Migrating: 2021_05_07_111050_create_posts_table
Migrated: 2021_05_07_111050_create_posts_table (11.36ms)
$
TablePlusで今作ったpostsテーブルの構造を確認すると
問題なく作れているようです。
記事Model
今作ったpostsテーブルを操作する記事のEloquentモデルを作成していきます。Modelを作成するにもartisanコマンドで作成できます。
php artisan make:model (モデルクラス名)
モデルのクラス名は一般的にテーブル名の単数形になります。今回はpostsテーブルだったのでモデルのクラス名はPostとして作成します。
$php artisan make:model Post
Model created successfully.
$
コマンドを実行したあとに
app/Models/Post.php
が生成されています。Modelはapp/Models/下に生成されます。
Tinker
TinkerでModelを使いテーブルを操作してみます。
まずはすべての記事を取得してみます。
>>> App\Models\Post::all();
=> Illuminate\Database\Eloquent\Collection {#4134
all: [],
}
もちろんまだテーブルを作成したばかりでデータはなにもないので空のコレクションが返ってきますね。
もちろんデータ数のカウントも0
>>> App\Models\Post::count();
=> 0
記事作成
>>> $post = new App\Models\Post;
=> App\Models\Post {#4066}
>>> $post->title = 'my blog post';
=> "my blog post"
>>> $post->excerpt = 'fasfa asdf as as fas dfasdfasdfasdf asdfa';
=> "fasfa asdf as as fas dfasdfasdfasdf asdfa"
>>> $post->body = 'jnf adfia oaf oasd nfoasidn faosid nfasoi dfasoi dfnasoi fnasoidfnasodifnasodifnasodi fnasoid n';
=> "jnf adfia oaf oasd nfoasidn faosid nfasoi dfasoi dfnasoi fnasoidfnasodifnasodifnasodi fnasoid n"
>>> $post->save();
=> true
>>>
まずpostインスタンスを作成します。
$post = new App\Models\Post;
そのあとにtitle, excerpt, body をそれぞれ入力し
最後にsaveでテーブルに保存します。
$post->save();
TablePlusで確認してもちゃんと保存されています。
先ほどデータが存在しない時に実行したコマンドを実行してみると、データが入っているのでもちろん結果は異なってきますね。
>>> App\Models\Post::count();
=> 1
>>> App\Models\Post::all();
=> Illuminate\Database\Eloquent\Collection {#3661
all: [
App\Models\Post {#4067
id: 1,
title: "my blog post",
excerpt: "fasfa asdf as as fas dfasdfasdfasdf asdfa",
body: "jnf adfia oaf oasd nfoasidn faosid nfasoi dfasoi dfnasoi fnasoidfnasodifnasodifnasodi fnasoid n",
created_at: "2021-05-07 12:00:43",
updated_at: "2021-05-07 12:00:43",
published_at: null,
},
],
}
>>> App\Models\Post::first();
=> App\Models\Post {#4279
id: 1,
title: "my blog post",
excerpt: "fasfa asdf as as fas dfasdfasdfasdf asdfa",
body: "jnf adfia oaf oasd nfoasidn faosid nfasoi dfasoi dfnasoi fnasoidfnasodifnasodifnasodi fnasoid n",
created_at: "2021-05-07 12:00:43",
updated_at: "2021-05-07 12:00:43",
published_at: null,
}
>>>
最後に
今回はマイグレーションからテーブルを作成し、そのテーブルを操作するModelを作成し、データを挿入しました。
今のところTinkerでデータ挿入をしただけですが、いずれフォームを使いデータを挿入していきます。次回はルーティングを設定し、ブログの記事の表示を行なっていきたいと思います。
この記事が気に入ったらサポートをしてみませんか?