Версія фреймворка: 8.x

Eloquent: серіалізація

Вступ

Створюючи API JSON, вам часто потрібно буде перетворити свої моделі та зв'язки в масиви або JSON. Eloquent включає зручні методи для здійснення цих перетворень, а також контроль того, які атрибути входять до ваших серіалізацій.

Серіалізація моделей та колекцій

Серіалізація до масивів

Для перетворення моделі та її завантаженнязв'язкидля масиву, ви повинні використовуватиtoArrayметод. Цей метод є рекурсивним, тому всі атрибути та всі зв'язки (включаючи зв'язки зв'язків) будуть перетворені в масиви:

$user = App\Models\User::with('roles')->first();

return $user->toArray();

Щоб перетворити в масив лише атрибути моделі, використовуйтеattributesToArrayметод:

$user = App\Models\User::first();

return $user->attributesToArray();

Ви також можете конвертувати ціліколекціймоделей до масивів:

$users = App\Models\User::all();

return $users->toArray();

Серіалізація до JSON

Щоб перетворити модель у JSON, вам слід використовуватиtoJsonметод. ЛюблюtoArray,toJsonметод є рекурсивним, тому всі атрибути та відношення будуть перетворені в JSON. Ви також можете вказати параметри кодування JSONпідтримується PHP:

$user = App\Models\User::find(1);

return $user->toJson();

return $user->toJson(JSON_PRETTY_PRINT);

Крім того, ви можете відлити модель або колекцію до рядка, який автоматично викликатимеtoJsonметод на моделі або колекції:

$user = App\Models\User::find(1);

return (string) $user;

Оскільки моделі та колекції перетворюються на JSON при передачі в рядок, ви можете повертати об'єкти Eloquent безпосередньо з маршрутів або контролерів програми:

Route::get('users', function () {
    return App\Models\User::all();
});

зв'язки

Коли модель Eloquent перетворюється на JSON, її завантажені зв'язки автоматично включатимуться як атрибути об'єкта JSON. Крім того, хоча Eloquent методи взаємозв'язку визначаються за допомогою "справи верблюда", атрибут JSON зв'язки буде "випадком змії".

Приховування атрибутів з JSON

Іноді вам може знадобитися обмежити такі атрибути, як паролі, які входять до масиву вашої моделі або представлення JSON. Для цього додайте a$hiddenвластивість до вашої моделі:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = ['password'];
}
Під час приховування зв’язків використовуйте ім’я методу зв’язку.

Ви також можете використовуватиvisibleвластивість визначати білий список атрибутів, які повинні бути включені в масив вашої моделі та представлення JSON. Усі інші атрибути будуть приховані при перетворенні моделі на масив або JSON:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be visible in arrays.
     *
     * @var array
     */
    protected $visible = ['first_name', 'last_name'];
}

Тимчасове змінення видимості атрибутів

Якщо ви хочете зробити деякі типово приховані атрибути видимими на даному екземплярі моделі, ви можете використовуватиmakeVisibleметод.makeVisibleметод повертає екземпляр моделі для зручного ланцюжка методів:

return $user->makeVisible('attribute')->toArray();

Аналогічним чином, якщо ви хочете зробити деякі типово видимі атрибути прихованими на даному екземплярі моделі, ви можете використовуватиmakeHiddenметод.

return $user->makeHidden('attribute')->toArray();

Додавання значень до JSON

Іноді, при передачі моделей до масиву або JSON, можливо, ви захочете додати атрибути, які не мають відповідного стовпця у вашій базі даних. Для цього спочатку визначтеаксесуардля значення:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the administrator flag for the user.
     *
     * @return bool
     */
    public function getIsAdminAttribute()
    {
        return $this->attributes['admin'] === 'yes';
    }
}

Після створення програми доступу додайте ім'я атрибута доappendsвластивість на моделі. Зверніть увагу, що на імена атрибутів зазвичай посилаються у "випадку змії", навіть незважаючи на те, що аксесуар визначається за допомогою "випадку верблюда":

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The accessors to append to the model's array form.
     *
     * @var array
     */
    protected $appends = ['is_admin'];
}

Після додавання атрибута доappendsсписку, він буде включений як у масив моделі, так і у JSON. Атрибути вappendsмасив також буде поважатиvisibleіhiddenналаштування, налаштовані на моделі.

Додавання під час роботи

Ви можете доручити одному екземпляру моделі додавати атрибути за допомогоюappendметод. Або ви можете використовуватиsetAppendsметод, щоб замінити весь масив доданих властивостей для даного екземпляра моделі:

return $user->append('is_admin')->toArray();

return $user->setAppends(['is_admin'])->toArray();

Серіалізація дати

Налаштування формату дати за замовчуванням

Ви можете налаштувати формат серіалізації за замовчуванням, замінившиserializeDateметод:

/**
 * Prepare a date for array / JSON serialization.
 *
 * @param  \DateTimeInterface  $date
 * @return string
 */
protected function serializeDate(DateTimeInterface $date)
{
    return $date->format('Y-m-d');
}

Налаштування формату дати на атрибут

Ви можете налаштувати формат серіалізації окремих Eloquent атрибутів дати, вказавши формат дати вакторська декларація:

protected $casts = [
    'birthday' => 'date:Y-m-d',
    'joined_at' => 'datetime:Y-m-d H:00',
];