はじめに
Laravelでデータベースに新しいレコード(データ)を保存するとき、
以下のようなコードを見かけたことはありませんか?
Post::create([
'title' => '新しい投稿',
'body' => '本文内容',
'user_id' => 1,
]);
この create() メソッド、簡潔で便利ですが「実際に何をしているの?」と疑問に感じる方もいると思います。
この記事では、Laravelの create() メソッドの役割・仕組み・使い方を、まとめました。
①create() メソッドとは?
- Eloquentモデルを使って、1件のレコードを一括で作成・保存できるメソッドです。
- 内部的には new + fill + save をまとめてやってくれる便利メソッドです。
②基本的な使い方
例)投稿(Post)モデルの場合
Post::create([
'title' => 'テスト投稿',
'body' => 'これは投稿本文です。',
'user_id' => Auth::id(),
]);
これで、posts テーブルに新しい投稿レコードが追加されます。
③注意:$fillable が必要!
create() を使うには、モデル側で代入を許可するカラムを $fillable で明示する必要があります。
Postモデルの例(app/Models/Post.php)
class Post extends Model
{
protected $fillable = ['title', 'body', 'user_id'];
}
これを設定しないと、MassAssignmentException (大量代入エラー)が発生します。
④なぜ $fillable が必要なの?
Laravelでは「ホワイトリスト方式」でセキュリティを守っています。
つまり、明示的に許可したカラムしか create() で登録できない仕組みです。
NGな例($fillable 未設定)
Post::create($request->all()); // セキュリティリスクあり!
→ 悪意のあるリクエストで admin = 1 などの値が送られてしまう危険があります。
⑤コントローラーでの活用例
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'body' => 'required|string',
]);
$validated['user_id'] = Auth::id();
Post::create($validated);
return redirect()->route('posts.index')->with('success', '投稿を作成しました!');
}
⑥create() の代わりに使える書き方(参考)
$post = new Post();
$post->title = 'タイトル';
$post->body = '本文';
$post->user_id = Auth::id();
$post->save();
→ こちらはより「手続き的」な書き方。
細かく処理したいときはこちらの方が適しています。
⑦まとめ
create() メソッドは、LaravelのEloquentを使う上でとても重要な基本の1つです。
正しく理解して、セキュアかつ効率的なデータ登録を実現しましょう!