ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
artisan make:model コマンド
Laravel Eloquent モデルは Artisan コマンドで生成します。最小はmake:model のみですが、関連ファイル一括生成のオプションが豊富です。
# モデルのみ生成 (app/Models/Post.php)
php artisan make:model Post
# モデル + マイグレーション
php artisan make:model Post -m
# モデル + マイグレーション + コントローラ
php artisan make:model Post -mc
# Resource Controller (index/store/show/update/destroy が雛形)
php artisan make:model Post -mcr
# モデル + Factory
php artisan make:model Post -f
# モデル + Seeder
php artisan make:model Post -s
# モデル + Policy (認可)
php artisan make:model Post --policy
# 全部入り (migration + controller + factory + seeder + policy + form-request)
php artisan make:model Post -a
# サブディレクトリ (app/Models/Blog/Post.php)
php artisan make:model Blog/Post
生成されるファイル
<?php
// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
}
テーブル名とプライマリキー
<?php
class Post extends Model
{
// デフォルトは複数形 snake_case (posts), 変えたい場合のみ指定
protected $table = 'blog_posts';
// プライマリキー (デフォルトは 'id')
protected $primaryKey = 'uuid';
// 自動増分でない場合
public $incrementing = false;
// PK の型
protected $keyType = 'string';
// タイムスタンプ自動更新を無効化
public $timestamps = false;
}
マスアサインメント: $fillable / $guarded
<?php
class Post extends Model
{
// ホワイトリスト: ここに書かれた列だけ create/fill/update でセット可能
protected $fillable = ['title', 'body', 'category_id'];
// または、ブラックリスト (どちらか片方)
// protected $guarded = ['id', 'is_admin'];
// 全許可 (危険、テスト時のみ推奨)
// protected $guarded = [];
}
// 利用
Post::create([
'title' => 'Hello',
'body' => '...',
'is_admin' => true, // ← $fillable に無いので無視される (MassAssignmentException も出ない)
]);
$casts: 型変換
<?php
class Order extends Model
{
protected $casts = [
'is_paid' => 'boolean',
'amount' => 'integer',
'tax_rate' => 'decimal:2',
'options' => 'array', // JSON ↔ PHP array
'metadata' => 'object', // JSON ↔ stdClass
'paid_at' => 'datetime', // → Carbon インスタンス
'paid_at_jst' => 'datetime:Y-m-d H:i:s',
'token' => 'encrypted', // 自動で暗号/復号
'status' => OrderStatus::class, // Enum (Laravel 9+)
];
}
$order = Order::find(1);
$order->is_paid; // (bool) true
$order->options; // array
$order->paid_at; // Carbon\Carbon
$order->paid_at->format('Y-m-d');
$hidden / $visible: シリアライズ制御
<?php
class User extends Model
{
// toArray / toJson から除外する列 (API レスポンス時の漏洩防止)
protected $hidden = ['password', 'remember_token', 'api_token'];
// または、明示的に許可する列のホワイトリスト
// protected $visible = ['id', 'name', 'email'];
// 計算プロパティをシリアライズに含める
protected $appends = ['full_name'];
public function getFullNameAttribute(): string {
return "{$this->first_name} {$this->last_name}";
}
}
リレーション
<?php
class User extends Model
{
// 1:N (User has many Posts)
public function posts() {
return $this->hasMany(Post::class);
}
// 1:1
public function profile() {
return $this->hasOne(Profile::class);
}
// 多対多 (中間テーブル必要: post_tag)
public function tags() {
return $this->belongsToMany(Tag::class)
->withPivot('order')
->withTimestamps();
}
}
class Post extends Model
{
// 逆 (Post belongs to User)
public function user() {
return $this->belongsTo(User::class);
}
// ポリモーフィック
public function comments() {
return $this->morphMany(Comment::class, 'commentable');
}
}
// 利用
$user = User::with(['posts', 'profile'])->find(1);
foreach ($user->posts as $post) {
echo $post->title;
}
// 関連を追加
$user->posts()->create(['title' => 'Hi']);
$user->tags()->sync([1, 2, 3]);
Accessor / Mutator (Laravel 9+ Attribute クラス)
<?php
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Model
{
// Laravel 9+ の Attribute クラスベース
protected function fullName(): Attribute {
return Attribute::make(
get: fn () => "{$this->first_name} {$this->last_name}",
set: fn ($value) => [
'first_name' => explode(' ', $value)[0],
'last_name' => explode(' ', $value)[1] ?? '',
],
);
}
// 旧スタイル (8 以前) - getXxxAttribute / setXxxAttribute
public function getEmailAttribute(string $value): string {
return strtolower($value);
}
public function setEmailAttribute(string $value): void {
$this->attributes['email'] = strtolower($value);
}
}
$user = User::find(1);
echo $user->full_name; // get で計算
$user->full_name = 'Alice Smith';
// → first_name='Alice', last_name='Smith' にセット
スコープ (Local / Global)
<?php
class Post extends Model
{
// ローカルスコープ - スコープ名は scope を除いて呼ぶ
public function scopePublished($query) {
return $query->where('status', 'published');
}
public function scopeByAuthor($query, int $userId) {
return $query->where('user_id', $userId);
}
}
// 利用
Post::published()->byAuthor(5)->get();
// Laravel 12+ では Attribute と同様に scope() static で書ける
ライフサイクルイベント
<?php
class Post extends Model
{
protected static function booted(): void {
// 保存前にスラグ生成
static::saving(function (Post $post) {
$post->slug = Str::slug($post->title);
});
// 削除時にキャッシュクリア
static::deleted(function (Post $post) {
Cache::forget("post.{$post->id}");
});
}
}
// または Observer クラスに切り出す: php artisan make:observer PostObserver --model=Post
Soft Delete (論理削除)
<?php
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at']; // Laravel 9+ では $casts に書く
}
// マイグレーションに $table->softDeletes(); 必要
Post::find(1)->delete(); // deleted_at にタイムスタンプ
Post::withTrashed()->find(1); // 削除済も含めて取得
Post::onlyTrashed()->get(); // 削除済のみ
Post::find(1)->restore(); // 復元
Post::find(1)->forceDelete(); // 物理削除
FAQ
Q: モデル名の規則
A: 単数形 PascalCase (Post) 推奨。テーブル名は自動で複数形 snake_case (posts) に。
Q: Models ディレクトリに置きたくない
A: Laravel 8+ は app/Models/ がデフォルト。古い慣習で app/ 直下に置きたい場合は --directory=app 不可、手動移動 + namespace 変更が必要。
Q: マイグレーションを再生成したい
A: make:model ではマイグレーションを上書きしません。既存マイグレーションを編集するか、削除して make:migration で新規作成。
Q: TypeScript の型生成も自動化したい
A: spatie/laravel-typescript-transformer や blueprint パッケージで Eloquent → TS 型を生成可能。フロント連携で便利。
📸 参考画像
※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。

ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?