見出し画像

[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テーブルの構造を確認すると

スクリーンショット 2021-05-07 20.35.37

問題なく作れているようです。

記事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で確認してもちゃんと保存されています。

スクリーンショット 2021-05-07 21.49.54

先ほどデータが存在しない時に実行したコマンドを実行してみると、データが入っているのでもちろん結果は異なってきますね。

>>> 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でデータ挿入をしただけですが、いずれフォームを使いデータを挿入していきます。次回はルーティングを設定し、ブログの記事の表示を行なっていきたいと思います。

この記事が気に入ったらサポートをしてみませんか?