本文へ移動
Laravel Tips

はじめての方へ・ステップ 8 / 12

モデルでデータを読み書きする

メモの表とやりとりする Memo モデルを作り、tinker でメモを作る・読む・直す・消すを試します。最後に、メモの一覧をデータベースから表示します。

表ができたので、PHP からメモを出し入れできるようにします。Laravel では、表ごとにモデル(データベースの表を、PHP から扱いやすくしたクラス)を1つ作ります。モデルを通すと、SQL(データベースへの命令の言葉)を書かなくても、Memo::create(...) のような PHP の書き方でデータを読み書きできます。このしくみを Eloquent(エロクアント)と呼びます。

モデルを作る#

ターミナルで次を実行します。

bash
php artisan make:model Memo

app/Models/Memo.php ができます。中身はまだほとんど空です。

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
<?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行ずつ打って、その場で結果を見られます。モデルを試すのにぴったりです。

bash
php artisan tinker

> という印が出たら、PHP を打てる状態です。次の行を1つずつ打って Enter を押してみましょう。終わるときは exit と打ちます。

ヒント

tinker の中では、モデルを App\Models\Memo のように、名前空間から全部書くと確実です。

メモを作る#

php
App\Models\Memo::create(['title' => '牛乳を買う', 'body' => '帰りにスーパーで2本'])

作ったメモが、次のように表示されます。id や日時は、Laravel が自動で入れてくれました。

text
= 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つ作っておきます。

php
App\Models\Memo::create(['title' => '数学の宿題をする'])
App\Models\Memo::create(['title' => '図書館に本を返す', 'body' => '金曜日まで'])

メモを読む#

php
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() で保存します。

php
$memo = App\Models\Memo::find(2)
$memo->body = '教科書の30ページ'
$memo->save()

メモを消す#

php
App\Models\Memo::find(3)->delete()

ためしたら、exit で tinker を終わります。

一覧をデータベースから出す#

いよいよ、メモ帳の一覧ページを、データベースのメモで表示します。routes/web.php の /memos のルートを、次のように書きかえます。いちばん上の use の行も1行足します。

php
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> の行を、メモのタイトルと作った日時を出すように変えます。

blade
<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日時点の内容をもとに、日本語でまとめています。

ページの一覧