Laravel 5.5
Сериализация в Eloquent
Введение
При разработке JSON API часто возникает необходимость конвертации моделей и их отношений в массивы и JSON. В Eloquent есть удобные методы для решения этой задачи, причем с возможностью контроля атрибутов.
Сериализация моделей и коллекций
Конвертация в массивы
Для конвертации модели и ее подгруженных отношений в массив, можно использовать метод toArray . Так как метод работает рекурсивно, то конвертированы будут все атрибуты и все отношения (включая отношения отношений):
1 2 3 4 5 |
$user = App\User::with('roles')->first(); return $user->toArray(); |
Вы можете конвертировать и коллекции моделей в массивы:
1 2 3 4 5 |
$users = App\User::all(); return $users->toArray(); |
Конвертация в JSON
Метод toJson предназначен для конвертации модели в JSON. Как и toArray , метод работает рекурсивно, поэтому все атрибуты и отношения будут преобразованы:
1 2 3 4 5 |
$user = App\User::find(1); return $user->toJson(); |
Второй способ: привести модель или коллекцию к типу string, что автоматически вызовет метод toJson:
1 2 3 4 5 |
$user = App\User::find(1); return (string) $user; |
Так как модели и коллекции конвертируются в JSON при приведении их к строке, то можно возвращать объекты Eloquent напрямую из роутов или контроллеров:
1 2 3 4 5 |
Route::get('users', function () { return App\User::all(); }); |
Скрытие атрибутов от JSON
Если вы хотите скрыть от сериализации в JSON и массив какие-нибудь атрибуты (например, пароль), то используйте свойство hidden в модели:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = ['password']; } |
! Для скрытия отношений используйте имя метода отношений
Другой подход: использовать в модели свойство visible , которое определяет список разрешенных для сериализации атрибутов. Все атрибуты вне этого списка будут скрыты для конвертации в массив или JSON:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php namespace App; 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 . Данный метод возвращает объект модели для удобной записи цепочки методов:
1 2 3 |
return $user->makeVisible('attribute')->toArray(); |
Если же необходимо видимый атрибут скрыть для конкретного объекта модели, то используйте метод makeHidden :
1 2 3 |
return $user->makeHidden('attribute')->toArray(); |
Добавление значений в JSON
В сериализацию можно добавить атрибут, для которого нет соответствующего столбца в базе данных. Для этого сначала определим аксессор:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App; 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 модели.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php namespace App; 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']; } |
Обратите внимание, что имена атрибутов обычно записываются в змеиной нотации ("snake case"), хотя аксессоры указываются в верблюжей нотации ("camel case").