はじめての方へ・ステップ 8 / 12
モデルでデータを読み書きする
メモの表とやりとりする Memo モデルを作り、tinker でメモを作る・読む・直す・消すを試します。最後に、メモの一覧をデータベースから表示します。
表ができたので、PHP からメモを出し入れできるようにします。Laravel では、表ごとにモデル(データベースの表を、PHP から扱いやすくしたクラス)を1つ作ります。モデルを通すと、SQL(データベースへの命令の言葉)を書かなくても、Memo::create(...) のような PHP の書き方でデータを読み書きできます。このしくみを Eloquent(エロクアント)と呼びます。
モデルを作る#
ターミナルで次を実行します。
php artisan make:model Memo
app/Models/Memo.php ができます。中身はまだほとんど空です。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Memo extends Model
{
//
}
モデルと表の名前の決まり#
モデルの名前は、表の名前を英語の単数形にして、頭を大文字にしたものにします。表が memos なら、モデルは Memo です。こうしておけば、Laravel が「Memo モデルは memos 表のことだ」と自動で分かってくれるので、表の名前を書かなくてすみます。
一括で入れてよい列を決める#
このあと、Memo::create(['title' => ..., 'body' => ...]) のように、配列でまとめて値を入れます。これをマスアサインメント(一括代入)と呼びます。Laravel のモデルは、安全のため、どの列を一括で入れてよいかを決めておかないと、この書き方を受けつけません。フォームに勝手な項目を足されても、決めた列以外は入らないようにするためです。
app/Models/Memo.php を次のように書きかえます。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Model;
#[Fillable(['title', 'body'])]
class Memo extends Model
{
//
}
#[Fillable([...])] は、クラスの前に書くPHP の属性(クラスに付ける印)です。「title と body は一括で入れてよい」という意味になります。
補足
古い版の Laravel の解説では、クラスの中に protected $fillable = [...] と書く形がよく出てきます。Laravel 13 の公式ドキュメントは、上のように属性で書く形を使っています。
tinker で試してみる#
php artisan tinker を使うと、ターミナルに PHP を1行ずつ打って、その場で結果を見られます。モデルを試すのにぴったりです。
php artisan tinker
> という印が出たら、PHP を打てる状態です。次の行を1つずつ打って Enter を押してみましょう。終わるときは exit と打ちます。
ヒント
tinker の中では、モデルを App\Models\Memo のように、名前空間から全部書くと確実です。
メモを作る#
App\Models\Memo::create(['title' => '牛乳を買う', 'body' => '帰りにスーパーで2本'])
作ったメモが、次のように表示されます。id や日時は、Laravel が自動で入れてくれました。
= App\Models\Memo {#7915
title: "牛乳を買う",
body: "帰りにスーパーで2本",
updated_at: "2026-10-05 15:35:06",
created_at: "2026-10-05 15:35:06",
id: 1,
}
もう2つ作っておきます。
App\Models\Memo::create(['title' => '数学の宿題をする'])
App\Models\Memo::create(['title' => '図書館に本を返す', 'body' => '金曜日まで'])
メモを読む#
App\Models\Memo::count()
App\Models\Memo::all()
App\Models\Memo::find(1)
App\Models\Memo::where('title', '牛乳を買う')->first()
| 書き方 | すること |
|---|---|
Memo::count() |
メモが何件あるかを数える |
Memo::all() |
全部のメモを取り出す |
Memo::find(1) |
id が 1 のメモを1つ取り出す。無ければ null |
Memo::where('title', '牛乳を買う')->first() |
タイトルが「牛乳を買う」のメモのうち、最初の1つを取り出す |
Memo::latest()->get() |
新しく作った順に並べて、全部取り出す |
メモを直す#
取り出したメモの値を書きかえて、save() で保存します。
$memo = App\Models\Memo::find(2)
$memo->body = '教科書の30ページ'
$memo->save()
メモを消す#
App\Models\Memo::find(3)->delete()
ためしたら、exit で tinker を終わります。
一覧をデータベースから出す#
いよいよ、メモ帳の一覧ページを、データベースのメモで表示します。routes/web.php の /memos のルートを、次のように書きかえます。いちばん上の use の行も1行足します。
use App\Models\Memo;
use Illuminate\Support\Facades\Route;
// (ほかのルートはそのまま)
Route::get('/memos', function () {
$memos = Memo::latest()->get();
return view('memos.index', ['memos' => $memos]);
});
$memos の中身が、文字の配列から、メモのモデルの集まりに変わりました。そこで、resources/views/memos/index.blade.php の <li> の行を、メモのタイトルと作った日時を出すように変えます。
<li>{{ $memo->title }}({{ $memo->created_at->format('n月j日 H:i') }})</li>
$memo->titleのように、->のあとに列の名前を書くと、その列の値が取り出せますcreated_atは日時のデータとして取り出されるので、format()で好きな形の文字にできます
http://localhost:8000/memos を開くと、tinker で作ったメモが新しい順に並びます。
補足
Memo::latest()->get() が返すのは、ただの配列ではなくコレクション(配列を便利に扱うための入れ物)です。count($memos) や @foreach は、これまでと同じように使えます。くわしくは Eloquent のコレクション
モデルでできることは、ほかにもたくさんあります。Eloquent の基本にまとめています。
次に読むページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。