ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
4 つの update パターン
use App\Models\Post;
// 1. プロパティ代入 → save()
$post = Post::find(1);
$post->title = 'New Title';
$post->status = 'published';
$post->save();
// 2. モデルの update()(配列指定)
$post = Post::find(1);
$post->update(['title' => 'New Title', 'status' => 'published']);
// 3. クエリビルダ経由の一括 update
Post::where('status', 'draft')
->where('created_at', '<', now()->subDays(30))
->update(['status' => 'archived']);
// 4. updateOrCreate(存在すれば更新、無ければ作成)
Post::updateOrCreate(
['slug' => 'hello-world'], // 検索条件
['title' => 'Hello', 'body' => '...'] // 値
);
save() vs update() の違い
| メソッド | 引数 | fillable 制限 | イベント |
|---|---|---|---|
$model->save() | 無し(プロパティ代入後) | 影響なし | saving/saved + updating/updated |
$model->update([]) | 配列 | ★ fillable 制限あり | saving/saved + updating/updated |
Model::where()->update([]) | 配列 | 制限なし(クエリビルダ) | ★ イベント発火しない |
fillable / guarded(Mass Assignment 対策)
配列から一括代入できる属性を制限することで、悪意あるリクエストで is_admin = true 等を勝手に上書きされる事故を防ぎます:
class Post extends Model
{
// ホワイトリスト方式(推奨)
protected $fillable = ['title', 'body', 'status'];
// または全許可(非推奨。$guarded で例外指定)
protected $guarded = ['id', 'is_admin'];
// 全許可(テスト/Seeder 用、本番禁止)
protected $guarded = [];
}
// fillable に無いキーは update() でスキップされる
$post->update([
'title' => 'OK',
'is_admin' => true, // ← 無視される(fillable に無いため)
]);
// 強制的に上書き
$post->forceFill(['is_admin' => true])->save();
updated_at の自動更新
// デフォルトで created_at / updated_at は自動管理
class Post extends Model
{
public $timestamps = true; // デフォルト
}
// 自動更新を止める
class Log extends Model
{
public $timestamps = false;
}
// 一時的に updated_at を更新しない(修正リバースで便利)
$post->timestamps = false;
$post->update(['title' => 'Quiet fix']);
$post->timestamps = true;
// updateQuietly()(Laravel 8+)でイベント発火 + updated_at 更新を制御
$post->updateQuietly(['title' => 'No event']);
// → イベント発火しない、updated_at は更新する
クエリビルダ経由の一括 update の特性
// ✅ 速い: 1 SQL で全件更新
Post::where('status', 'draft')->update(['status' => 'published']);
// UPDATE posts SET status = 'published' WHERE status = 'draft'
// ⚠️ 注意点:
// - モデルイベント (updating/updated) は発火しない
// - observer も呼ばれない
// - updated_at は自動更新される(カスタムタイムスタンプは効く)
// - Mutator (setXxxAttribute) は通らない(DB 直アクセス)
// ✅ イベントを起こしたいなら chunk で個別 save
Post::where('status', 'draft')
->chunkById(100, function ($posts) {
foreach ($posts as $post) {
$post->update(['status' => 'published']);
}
});
increment / decrement
// インスタンス経由
$post->increment('view_count'); // +1
$post->increment('view_count', 5); // +5
$post->decrement('stock', 1); // -1
// クエリビルダ経由
Post::where('id', 1)->increment('view_count');
// 同時に他カラムも更新(原子的)
$post->increment('view_count', 1, ['last_viewed_at' => now()]);
updateOrCreate / firstOrCreate / firstOrNew
// 既存なら更新、無ければ新規(upsert)
$post = Post::updateOrCreate(
['slug' => 'hello'], // 検索条件(複数キー可)
['title' => 'Hello', 'body' => '...']
);
// 既存なら取得、無ければ作成(更新しない)
$post = Post::firstOrCreate(
['slug' => 'hello'],
['title' => 'Hello', 'body' => '...']
);
// 既存なら取得、無ければ未保存インスタンス(save 必要)
$post = Post::firstOrNew(['slug' => 'hello']);
$post->title = 'Hello';
$post->save();
// 複数件の upsert(Laravel 8+)
Post::upsert(
[
['slug' => 'a', 'title' => 'A'],
['slug' => 'b', 'title' => 'B'],
],
uniqueBy: ['slug'], // 一意キー
update: ['title'] // 競合時に更新するカラム
);
イベント / Observer で履歴を取る
// app/Observers/PostObserver.php
class PostObserver
{
public function updating(Post $post): void
{
// save 前。getDirty() で変更されるカラム一覧を取れる
if ($post->isDirty('status')) {
PostStatusLog::create([
'post_id' => $post->id,
'from' => $post->getOriginal('status'),
'to' => $post->status,
'changed_by' => auth()->id(),
]);
}
}
public function updated(Post $post): void
{
// save 後
if ($post->wasChanged('title')) {
Cache::forget("post_html_{$post->id}");
}
}
}
// app/Providers/AppServiceProvider.php boot()
Post::observe(PostObserver::class);
トランザクションで整合性を担保
use Illuminate\Support\Facades\DB;
DB::transaction(function () use ($postId) {
$post = Post::lockForUpdate()->find($postId); // 行ロック
$post->update(['status' => 'published']);
$post->author->increment('published_count');
Notification::send($post->subscribers, new PostPublished($post));
});
// 手動トランザクション
DB::beginTransaction();
try {
// ... 複数 update ...
DB::commit();
} catch (\Throwable $e) {
DB::rollBack();
throw $e;
}
楽観的ロック
同時編集による上書き事故を防ぐパターン。version カラムで判定:
// posts に version カラムを追加(int default 0)
$post = Post::find($id);
$currentVersion = $post->version;
// 更新時に version 一致を条件にする
$updated = Post::where('id', $id)
->where('version', $currentVersion)
->update([
'title' => $request->title,
'version' => $currentVersion + 1,
]);
if ($updated === 0) {
// 他のユーザが先に更新した
abort(409, '他のユーザによって編集されました。再読み込みしてください');
}
FAQ
Q: save() しても DB が更新されない
A: 変更前と同じ値の場合、Eloquent は SQL を発行しません。$model->isDirty() や getDirty() で確認できます。
Q: Mass Assignment 例外(MassAssignmentException)が出る
A: $fillable に対象カラムを追加するか、forceFill() を使ってください。
Q: 一括更新で観測者を呼びたい
A: クエリビルダ経由は observer をスキップします。chunkById でループしながら個別 save() するか、SQL 直書き後に手動で発火させてください。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 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
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 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
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?