Eloquent: серіалізація
- Вступ
- Серіалізація моделей та колекцій
- Приховування атрибутів з JSON
- Додавання значень до JSON
- Серіалізація дати
Вступ
Створюючи 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',
];