5.

Laravel の make:model|-m や --all オプションと命名規則

編集
この記事の要点
  • 作成コマンドは php artisan make:model Post。生成先は app/Models/
  • モデル名は単数形の PascalCase。テーブル名は自動で複数形の snake_case になる
  • マイグレーションも一緒に作るなら -m。実務ではほぼ必ず付ける
  • --all でマイグレーション・ファクトリ・シーダー・コントローラー・リクエストまで一式作れる
  • 生成後にやることは $fillable の設定とリレーションの定義

基本

php artisan make:model Post
INFO  Model [app/Models/Post.php] created successfully.
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
}

Laravel 8 以降は app/Models/ に作られます。7 以前は app/ 直下だったため、古い記事のパスと違う点に注意してください。

オプション一覧

オプション一緒に作られるもの
-m / --migrationマイグレーション
-c / --controllerコントローラー
-r / --resourceリソースコントローラー(-c と併用)
-f / --factoryファクトリ(テストデータ生成用)
-s / --seedシーダー
-R / --requestsフォームリクエスト(-c と併用)
-p / --policyポリシー(認可)
--pivot中間テーブル用のモデル
--all上のほぼ全部
--force同名があっても上書きする
php artisan make:model Post -m                 # よく使う(モデル + マイグレーション)
php artisan make:model Post -mcr               # + リソースコントローラー
php artisan make:model Post -mfs               # + ファクトリ + シーダー
php artisan make:model Post --all              # 一式まとめて

# 短縮形はまとめて書ける
php artisan make:model Post -a                 # --all と同じ
app/Models/Post.php
app/Http/Controllers/PostController.php
app/Http/Requests/StorePostRequest.php
app/Http/Requests/UpdatePostRequest.php
app/Policies/PostPolicy.php
database/factories/PostFactory.php
database/migrations/2026_09_07_120000_create_posts_table.php
database/seeders/PostSeeder.php

名前の付け方とテーブル名

モデル名自動で使われるテーブル名
Postposts
BlogPostblog_posts
Categorycategories
Personpeople
Newsnews

Laravel は英語の複数形ルールで変換します。日本語のローマ字(Shohinshohins)や不規則な名前では意図と違うテーブル名になるため、その場合は明示します。

class Post extends Model
{
    protected $table = 'blog_entries';    // テーブル名を指定
    protected $primaryKey = 'post_id';    // 主キーが id でない場合
    public $incrementing = false;         // 主キーが自動採番でない場合
    protected $keyType = 'string';        // 主キーが数値でない場合
    public $timestamps = false;           // created_at / updated_at が無い場合
}

サブディレクトリに作る

php artisan make:model Blog/Post -m
// app/Models/Blog/Post.php
namespace App\Models\Blog;      // 名前空間も自動で付く

class Post extends Model
{
    protected $table = 'posts';  // ← サブディレクトリ名はテーブル名に影響しないが
}                                //   名前空間を含めた推測になるため明示すると確実

生成した直後にやること

class Post extends Model
{
    use HasFactory;

    // 1. 一括代入を許可するカラム(これが無いと create() が値を無視する)
    protected $fillable = ['title', 'body', 'published_at'];

    // 2. 型変換
    protected $casts = [
        'published_at' => 'datetime',
        'is_public'    => 'boolean',
        'meta'         => 'array',
    ];

    // 3. JSON に出したくないカラム
    protected $hidden = ['secret_token'];

    // 4. リレーション
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

$fillable を設定しないと Post::create([...]) で次のエラーになります。

Add [title] to fillable property to allow mass assignment on [App\Models\Post].

対処は Add [~] to fillable property to allow mass assignment を参照してください。$fillable$guarded の使い分けは $fillable $guarded $hiddenの説明 にまとめています。

マイグレーションを書いて反映する

// database/migrations/xxxx_create_posts_table.php
public function up(): void
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->cascadeOnDelete();
        $table->string('title');
        $table->text('body')->nullable();
        $table->timestamp('published_at')->nullable()->index();
        $table->timestamps();
    });
}
php artisan migrate

動作確認

php artisan tinker
>>> App\Models\Post::count()
=> 0

>>> $p = App\Models\Post::create(['title' => 'テスト', 'body' => '本文']);
>>> $p->id
=> 1

>>> App\Models\Post::first()->title
=> "テスト"

>>> (new App\Models\Post)->getTable()      # 実際に使われるテーブル名
=> "posts"

getTable()Laravel が推測したテーブル名を確認できます。Base table or view not found が出るときはここを見てください。

関連するコマンド

php artisan make:migration add_status_to_posts_table --table=posts
php artisan make:controller PostController --resource --model=Post
php artisan make:factory PostFactory --model=Post
php artisan make:seeder PostSeeder
php artisan make:policy PostPolicy --model=Post
php artisan make:observer PostObserver --model=Post

php artisan model:show Post      # 属性・リレーション・キャストを一覧表示(Laravel 10 以降)

つまずきやすい点

症状原因
Class "App\Models\Post" not found名前空間の書き忘れ。composer dump-autoload も試す
Base table or view not foundテーブル名の推測ずれ。$table を明示する
create() しても値が入らない$fillable が未設定
モデル名を複数形(Posts)にしたテーブル名が posts にならない。単数形にする
すでにあるモデルを作り直したい--force中身が消えるので注意

モデル側の書き方(フィールド定義・リレーション・スコープ)は モデルの作成Eloquentモデル (ORM) で詳しく扱っています。

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 新規プロジェクトの作成
  2. サーバーの起動
  3. マイグレーションファイルの作成
  4. マイグレーションの実行(migrate)
  5. モデルの作成
  6. 全ルートを確認
  7. Laravelのバージョンの確認方法

最近更新/作成されたページ