ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Eloquent とは
Eloquent は Laravel に同梱されている ORM(Object Relational Mapper)です。1 つのテーブルに 1 つの PHP クラスを対応させ、SQL を書かずに CRUD を行えます。Active Record パターンに基づき、「モデル=レコード」として扱えるのが特徴です。
モデルの作成と最小定義
# users テーブルに対応するモデルを生成
php artisan make:model User
# マイグレーションも同時に生成
php artisan make:model Post -m
# コントローラ・ファクトリ・シーダもまとめて
php artisan make:model Post -mfsc 'datetime',
'is_admin' => 'boolean',
'settings' => 'array',
'role' => UserRole::class, // Enum
];
// JSON シリアライズ時に隠すカラム
protected $hidden = ['password', 'remember_token'];
}
CRUD の基本
use App\Models\User;
// ============== Create ==============
// 1) 一括代入(fillable に列挙が必要)
$user = User::create([
'name' => 'Taro',
'email' => 'taro@example.com',
'password' => bcrypt('secret'),
]);
// 2) 属性ごとに代入して save
$user = new User();
$user->name = 'Taro';
$user->save();
// ============== Read ==============
User::all(); // 全件
User::find(1); // 主キー 1 件、なければ null
User::findOrFail(1); // 無ければ 404
User::where('email', 'taro@example.com')->first();
User::where('age', '>=', 18)->orderBy('id', 'desc')->limit(10)->get();
User::count();
User::pluck('email'); // email 列だけ Collection
User::whereIn('id', [1, 2, 3])->get();
// ============== Update ==============
$user = User::find(1);
$user->name = 'Jiro';
$user->save();
// 一括 update(fillable 不要、直接 UPDATE 文)
User::where('is_admin', false)->update(['status' => 'inactive']);
// 取得と更新を 1 行
User::find(1)->update(['name' => 'Jiro']);
// ============== Delete ==============
User::find(1)->delete();
User::where('status', 'inactive')->delete();
User::destroy([1, 2, 3]); // 主キー指定で複数削除
$fillable と $guarded(マスアサインメント保護)
外部入力($request->all() 等)をそのまま create() や update() に渡すと、意図しないカラム(例: is_admin)まで書き換えられるセキュリティリスクがあります。これを防ぐのが Mass Assignment Protection です。
| プロパティ | 意味 | 用途 |
|---|---|---|
$fillable | 許可リスト | 列挙したカラムだけ一括代入可(推奨) |
$guarded | 拒否リスト | 列挙したカラムだけ拒否。[] で全許可(危険) |
$casts による型変換
protected $casts = [
'is_admin' => 'boolean', // 0/1 → true/false
'price' => 'integer',
'rate' => 'float',
'options' => 'array', // JSON ←→ PHP 配列
'meta' => 'object',
'published_at'=> 'datetime', // string ←→ Carbon
'birthday' => 'date',
'role' => UserRole::class, // PHP 8.1+ Enum
'password' => 'hashed', // Laravel 10+: 自動 bcrypt
];
// 取得時に Carbon オブジェクトになる
$user->published_at->format('Y-m-d');
$user->published_at->diffForHumans();
// options を配列のまま扱える
$user->options = ['theme' => 'dark'];
$user->save(); // DB には JSON で保存
リレーション
// ===== 1 対 1(hasOne / belongsTo)=====
// users.id ← profiles.user_id
class User extends Model {
public function profile() {
return $this->hasOne(Profile::class);
}
}
class Profile extends Model {
public function user() {
return $this->belongsTo(User::class);
}
}
// 使い方
$user = User::find(1);
$user->profile->bio; // hasOne を辿る
$profile->user->name; // belongsTo を辿る
// ===== 1 対 多(hasMany)=====
class User extends Model {
public function posts() {
return $this->hasMany(Post::class);
}
}
$user->posts; // Collection
$user->posts()->where('published', true)->get();
// ===== 多 対 多(belongsToMany)=====
// users ─ role_user ─ roles
class User extends Model {
public function roles() {
return $this->belongsToMany(Role::class)
->withPivot('assigned_at')
->withTimestamps();
}
}
$user->roles; // Collection
$user->roles()->attach($roleId);
$user->roles()->detach($roleId);
$user->roles()->sync([1, 2, 3]);
N+1 問題と Eager Loading
リレーションを使うときに最も注意すべきが N+1 問題です。
// ❌ N+1: posts 1 回 + 各 post の user で N 回、合計 N+1 クエリ
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name; // 毎ループで SELECT が走る
}
// ✅ Eager Loading: 合計 2 クエリで済む
$posts = Post::with('user')->get();
foreach ($posts as $post) {
echo $post->user->name; // 追加クエリなし
}
// 複数リレーション
Post::with(['user', 'comments', 'tags'])->get();
// ネスト
Post::with('comments.user')->get();
// 条件付き Eager Loading
Post::with(['comments' => function ($q) {
$q->where('approved', true)->latest();
}])->get();
クエリスコープ(再利用可能な where)
class Post extends Model
{
// ローカルスコープ: scope プレフィックス
public function scopePublished($query) {
return $query->where('status', 'published');
}
public function scopeOfAuthor($query, int $authorId) {
return $query->where('author_id', $authorId);
}
}
// 利用側はメソッドチェーンで
Post::published()->ofAuthor(1)->latest()->get();
アクセサ・ミューテタ
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Model
{
// Laravel 9+ の新記法
protected function fullName(): Attribute
{
return Attribute::make(
get: fn ($value, $attributes) => $attributes['first_name'] . ' ' . $attributes['last_name'],
set: fn ($value) => ['first_name' => explode(' ', $value)[0]],
);
}
}
echo $user->full_name; // アクセサ経由で取得
$user->full_name = 'Taro Sato'; // ミューテタ経由で代入
よく使う追加メソッド
User::firstOrCreate(['email' => $e], ['name' => $n])— 存在すれば取得、無ければ作成User::updateOrCreate(['email' => $e], ['name' => $n])— UPSERT 相当User::chunk(200, function ($users) { ... })— 大量データを分割処理User::cursor()— メモリ効率の良いイテレータ$user->toArray()/->toJson()— シリアライズ$user->refresh()/->fresh()— DB から再取得
FAQ
Q: save() と update() の違いは?
A: save() は属性代入後にインスタンスを保存。update() は一括代入+保存を一度に行うショートカット(fillable が効きます)。
Q: 生 SQL を書きたい
A: DB::select('SELECT ...') や User::whereRaw('YEAR(created_at) = ?', [2026]) が使えます。
Q: ソフトデリート(論理削除)したい
A: use SoftDeletes; トレイトを追加し、マイグレーションで $table->softDeletes(); を入れると deleted_at による論理削除になります。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
- インストールと設定
- クイックスタート & チュートリアル(初心者向け)
- クイックスタート & チュートリアル(中級者向け)
- ルーティング
- Bladeテンプレート(ビュー/レイアウト)
- コントローラー
- マイグレーションとテーブル定義
- データベースの設定
- Eloquentモデル (ORM)
- SQLとクエリビルダー
- バリデーション
- .envファイルの設定値へのアクセス
- 動作環境による分岐処理
- configフォルダ配下の設定値へのアクセス
- assetヘルパーを利用したpublicフォルダへのアクセス
- storageフォルダへのアクセス
- アプリケーション名の変更
- メンテナンス
- ログイン画面(認証システム)の作成
- ログインの必須化
- ログインユーザー情報の取得
- ルートの認証化
- 本番サーバーへのデプロイ方法
- 多言語化
- csrf_field
- ファイルのダウンロード
- CSVのアップロードおよび読み込み(maatwebsite/excel)
- ページタイトルの設定
- コマンド一覧
- エラー一覧
- SQLの実行ログ出力方法
- キャッシュのクリア
- Selectの結果の最初もしくは最後に任意の値を追加する方法
- ajaxでPOST通信する際の注意点
- ソーシャルログインの実装
- セッション情報の確認
- ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
- redirectやreturn viewにメッセージを付与する方法
- クッキー(cookie)の設定と取得
- クラスの再読み込み
- csrfの有効時間を変更する方法
- ViewComposerを用いてviewに共通の値を付与する方法
- View::shareを用いて共通の値を各ビューに渡す方法
- ミドルウェアを用いた処理の共通化
- Middleware内でAuth::check()などを使用する方法
- Controller以外でリダイレクトする方法
- セッションの値の取得/保存/更新/削除
- $requestの値を変更する方法
- 常時SSL化
- ページング(ページネーション)をする方法
- vue.jsとの連携
- Vue.jsと連携するSPA実行環境構築
- .envの値をvue.jsで参照する方法
- vue.jsを本番環境にリリースする方法
- could not find driver(Windows, MySQL編)
人気ページ
- 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アノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?