配列や JSON に変換する
モデルやコレクションを配列や JSON に変える方法と、パスワードなどを隠す設定、追加の値の足し方、日付の形の変え方を説明します。
API(ほかのプログラムにデータを渡す窓口)を作るとき、モデルやリレーションを、配列や JSON(データを文字で表す形式)に変えたいことがよくあります。この「変える」ことを、シリアライズと言います。Eloquent には、この変換をするメソッドと、変換後の形に入れる属性(カラムの値)を決めるしくみがあります。
補足
モデルやコレクションを JSON にする、もっとしっかりした方法として、API リソースがあります。
モデルとコレクションを変える#
配列に変える#
モデルと、読み込み済みのリレーション(表どうしのつながり)を配列に変えるには、toArray を使います。このメソッドは再帰的(中の中まで順に処理)なので、全部の属性と全部のリレーション(リレーションのリレーションも)が配列になります。
use App\Models\User;
$user = User::with('roles')->first();
return $user->toArray();
attributesToArray は、モデルの属性だけを配列にします。リレーションは入りません。
$user = User::first();
return $user->attributesToArray();
モデルのコレクション全体も、コレクションの toArray で、配列にできます。
$users = User::all();
return $users->toArray();
JSON に変える#
モデルを JSON に変えるには、toJson を使います。toArray と同じく再帰的なので、全部の属性とリレーションが JSON になります。PHP が対応している JSON の変換オプションも渡せます。
use App\Models\User;
$user = User::find(1);
return $user->toJson();
return $user->toJson(JSON_PRETTY_PRINT);
モデルやコレクションを文字列にキャスト(型を変えること)しても、自動で toJson が呼ばれます。
return (string) User::find(1);
文字列にすると JSON になるので、アプリのルートやコントローラーから、Eloquent のオブジェクトを、そのまま返せます。Laravel が、自動で JSON に変えます。
Route::get('/users', function () {
return User::all();
});
| メソッド | 働き |
|---|---|
toArray |
属性とリレーションを、配列にする |
attributesToArray |
属性だけを、配列にする |
toJson |
属性とリレーションを、JSON にする |
リレーションの名前#
モデルを JSON にすると、読み込み済みのリレーションも、JSON の属性として自動で入ります。また、リレーションのメソッドの名前は「キャメルケース」(postComments のように単語をつなげる書き方)で書きますが、JSON の属性の名前は「スネークケース」(post_comments のように _ でつなぐ書き方)になります。
JSON から属性を隠す#
パスワードなど、配列や JSON に入れたくない属性があることがあります。モデルに Hidden 属性(PHP の属性。クラスの前に書く印)を付けます。Hidden に書いた属性は、モデルを変換した結果に入りません。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Hidden;
use Illuminate\Database\Eloquent\Model;
#[Hidden(['password'])]
class User extends Model
{
// ...
}
補足
リレーションを隠すには、モデルの Hidden 属性に、そのリレーションのメソッドの名前を足します。
反対に、Visible 属性で、入れてよい属性の「許可リスト」を決めることもできます。Visible にない属性は、配列や JSON に変えるとき、全部隠れます。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Visible;
use Illuminate\Database\Eloquent\Model;
#[Visible(['first_name', 'last_name'])]
class User extends Model
{
// ...
}
見える・隠れるを一時的に変える#
ふだんは隠れている属性を、あるモデルだけ見えるようにしたいときは、makeVisible か mergeVisible を使います。makeVisible は、モデルを返します。
return $user->makeVisible('attribute')->toArray();
return $user->mergeVisible(['name', 'email'])->toArray();
同じように、ふだんは見える属性を隠したいときは、makeHidden か mergeHidden を使います。
return $user->makeHidden('attribute')->toArray();
return $user->mergeHidden(['name', 'email'])->toArray();
見える属性や隠す属性を、全部、一時的に置き換えたいときは、setVisible と setHidden を使います。
return $user->setVisible(['id', 'name'])->toArray();
return $user->setHidden(['email', 'password', 'remember_token'])->toArray();
| メソッド | 働き |
|---|---|
makeVisible |
隠れている属性を、見えるようにする |
mergeVisible |
いま見える属性は残して、見える属性を足す |
makeHidden |
見える属性を、隠す |
mergeHidden |
いま隠れている属性は残して、隠す属性を足す |
setVisible |
見える属性を、全部置き換える |
setHidden |
隠す属性を、全部置き換える |
JSON に値を足す#
モデルを配列や JSON に変えるとき、データベースにカラムがない属性を足したいことがあります。まず、その値のアクセサ(属性を読むときに値を加工する仕組み)を書きます。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Determine if the user is an administrator.
*/
protected function isAdmin(): Attribute
{
return new Attribute(
get: fn () => 'yes',
);
}
}
このアクセサを、いつもモデルの配列や JSON に足したいときは、モデルに Appends 属性を付けます。アクセサのメソッドの名前はキャメルケースですが、Appends に書く名前は、ふつう、配列や JSON に出るときの形(スネークケース)にします。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Model;
#[Appends(['is_admin'])]
class User extends Model
{
// ...
}
appends のリストに足した属性は、モデルの配列と JSON の両方に入ります。また、appends にある属性も、モデルの visible と hidden の設定に従います。
実行中に足す#
プログラムの途中で、1つのモデルにだけ足す属性を決めたいときは、append か mergeAppends を使います。setAppends は、そのモデルの足す属性の配列を、全部置き換えます。
return $user->append('is_admin')->toArray();
return $user->mergeAppends(['is_admin', 'status'])->toArray();
return $user->setAppends(['is_admin'])->toArray();
同じように、モデルの、足す属性を全部取り除きたいときは、withoutAppends を使います。
return $user->withoutAppends()->toArray();
| メソッド | 働き |
|---|---|
append |
足す属性を足す |
mergeAppends |
いまの足す属性は残して、足す属性を足す |
setAppends |
足す属性を、全部置き換える |
withoutAppends |
足す属性を、全部取り除く |
日付の変換#
日付の形を全体で変える#
日付を配列や JSON に変えるときの、既定の形は、serializeDate を書き換えて変えられます。この設定は、データベースに保存するときの日付の形には、影響しません。
/**
* Prepare a date for array / JSON serialization.
*/
protected function serializeDate(DateTimeInterface $date): string
{
return $date->format('Y-m-d');
}
日付の形を属性ごとに変える#
Eloquent の日付の属性ごとに、変換の形を変えるには、モデルのキャストの宣言に、日付の形を書きます。
protected function casts(): array
{
return [
'birthday' => 'date:Y-m-d',
'joined_at' => 'datetime:Y-m-d H:00',
];
}
関連するページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。