ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
クエリビルダによる INSERT の基本
Laravel の DB::table() から呼び出すクエリビルダは、生 SQL を書かずに型安全に INSERT を発行できます。最低限の構文は以下のとおりです。
use Illuminate\Support\Facades\DB;
// 1 行挿入
DB::table('users')->insert([
'name' => 'taro',
'email' => 'taro@example.com',
'created_at' => now(),
'updated_at' => now(),
]);
内部的には INSERT INTO users (name, email, created_at, updated_at) VALUES (?, ?, ?, ?) と prepared statement になり、値は PDO 側でエスケープされます。シングルクオートやセミコロンを含む値でも SQL インジェクションになりません。
auto increment ID を取得する
挿入直後にその行の主キーが欲しい場合は insertGetId() を使います。戻り値は新しい ID (int) です。
$id = DB::table('users')->insertGetId([
'name' => 'jiro',
'email' => 'jiro@example.com',
]);
// PostgreSQL 等で別カラム名のシーケンスを使う場合は第二引数で指定
$id = DB::table('orders')->insertGetId($data, 'order_id');
複数行を一括 INSERT
連想配列の配列を渡すと INSERT ... VALUES (...), (...), (...) という単一クエリで挿入されます。N 行を N 回の INSERT で投げるのに比べてはるかに高速です。
DB::table('users')->insert([
['name' => 'taro', 'email' => 'taro@example.com'],
['name' => 'jiro', 'email' => 'jiro@example.com'],
['name' => 'saburo', 'email' => 'saburo@example.com'],
]);
// 巨大配列はチャンク化(MySQL は max_allowed_packet 制限あり)
collect($bigRows)->chunk(1000)->each(function ($chunk) {
DB::table('logs')->insert($chunk->toArray());
});
insertOrIgnore — 重複時は無視
UNIQUE 制約違反のときに例外を投げず黙ってスキップしたいなら insertOrIgnore()。戻り値は実際に挿入された行数です。
$inserted = DB::table('email_subscribers')->insertOrIgnore([
['email' => 'a@example.com'],
['email' => 'b@example.com'],
['email' => 'a@example.com'], // 重複 → 無視
]);
// $inserted = 2
upsert — INSERT or UPDATE
主キー or UNIQUE キーで衝突したら指定カラムを UPDATE します。MySQL の ON DUPLICATE KEY UPDATE、PostgreSQL の ON CONFLICT を抽象化したものです。
DB::table('product_stocks')->upsert(
[
['product_id' => 1, 'qty' => 10],
['product_id' => 2, 'qty' => 5],
],
['product_id'], // 一意キー
['qty'] // 衝突時に上書きするカラム
);
Eloquent モデルでの INSERT
Eloquent では create() または save() を使います。$fillable 未設定だと Mass Assignment 例外が発生するので注意してください。
class User extends Model
{
protected $fillable = ['name', 'email'];
}
// 一括代入 + 保存
$user = User::create([
'name' => 'taro',
'email' => 'taro@example.com',
]);
// 個別代入
$u = new User();
$u->name = 'jiro';
$u->email = 'jiro@example.com';
$u->save();
// 重複なら作成しない
User::firstOrCreate(
['email' => 'taro@example.com'], // 検索条件
['name' => 'taro'] // 無ければ作る値
);
クエリビルダ vs Eloquent vs 生 SQL
| 方法 | 用途 | 速度 | イベント |
|---|---|---|---|
DB::insert() 生 SQL | 特殊な SQL を直接書きたい | ★★★ | 無し |
クエリビルダ insert() | シンプル / 大量バッチ | ★★★ | 無し (モデルイベント不発火) |
Eloquent create() | 1 件ずつ、属性キャスト / リレーション利用 | ★★ | creating / created 発火 |
トランザクションと組み合わせる
DB::transaction(function () {
$userId = DB::table('users')->insertGetId([
'name' => 'taro',
'email' => 'taro@example.com',
]);
DB::table('user_profiles')->insert([
'user_id' => $userId,
'bio' => 'hello',
]);
}, 3); // 第二引数はデッドロック時のリトライ回数
途中で例外が出ると自動 ROLLBACK されます。明示的に DB::beginTransaction() / DB::commit() / DB::rollBack() を呼ぶこともできます。
よくあるエラーと対処
| エラー | 原因 | 対処 |
|---|---|---|
SQLSTATE[23000] Duplicate entry | UNIQUE 制約違反 | insertOrIgnore / upsert |
MassAssignmentException | $fillable 未設定 | Eloquent モデルに $fillable 追加 |
Field doesn't have a default value | NOT NULL カラムを未指定 | カラムに値 or DB 側で DEFAULT |
SQLSTATE[HY000] [2006] MySQL server has gone away | 大量 INSERT で max_allowed_packet 超過 | チャンク化 or max_allowed_packet 増 |
FAQ
Q: Eloquent の create() でタイムスタンプが入らない
A: モデルで public $timestamps = true; (デフォルト) かつテーブルに created_at / updated_at が必要です。クエリビルダ insert() は自動で入れてくれません。
Q: insert 後の ID が 0 になる
A: insert() は bool を返します。ID が欲しい場合は必ず insertGetId() を使ってください。
Q: 数万件を高速で入れたい
A: チャンク化した一括 INSERT + DB::transaction() でくくる + 不要なインデックスは一時的に ALTER TABLE ... DISABLE KEYS。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 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 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?