| この記事の要点 |
|
基本
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
名前の付け方とテーブル名
| モデル名 | 自動で使われるテーブル名 |
|---|---|
Post | posts |
BlogPost | blog_posts |
Category | categories |
Person | people |
News | news |
Laravel は英語の複数形ルールで変換します。日本語のローマ字(Shohin → shohins)や不規則な名前では意図と違うテーブル名になるため、その場合は明示します。
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) で詳しく扱っています。
関連
- コマンド一覧 — 親カテゴリ
- モデルの作成 — モデルの中身の書き方
- Eloquentモデル (ORM)
- マイグレーションファイルの作成
- マイグレーションの実行(migrate)
- テーブルの紐づけ
子ページ
子ページはありません
同階層のページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38