Вы когда-нибудь хотели привести свои столбцы JSON к объекту-значению?
Под капотом он реализует интерфейс Laravel Arrayable, которое обрабатывает сериализацию между JsonCastable и столбцом базы данных JSON.
You can install the package via composer:
$ composer require dimalebid/laravel-json-cast
namespace App\Models\User;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use App\Models\User\Settings\Settings;
class UserSettings implements CastsAttributes
{
public function get($model, string $key, $value, array $attributes)
{
return new Settings((array)json_decode($value, true));
}
public function set($model, string $key, $value, array $attributes)
{
return json_encode(get_object_vars($value));
}
}
namespace App\Models\User\Settings;
use DimaLebid\LaravelJsonCast\JsonCastable;
use App\Models\User\Settings\Auth;
class Settings extends JsonCastable
{
public Auth $auth;
public string $country = 'Ukraine';
public ?string $phone;
public function __construct(array $attributes)
{
$this->auth = new Auth($attributes);
parent::__construct($attributes);
}
}
Обьект Auth
похож на Settings
с одним отличием что в нем нет конструктора.
namespace App\Models;
use App\Values\Address;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $casts = [
'settings' => UserSettings::class,
];
}
$userId = 1;
$user = User::find($userId);
$settings = $user->settings;
dd($settings->country);
//or
dd($settings->auth->facebook);
$userId = 1;
$user = User::find($userId);
$user->settings->country = 'USA';
$user->save();
Вот так легко и просто можно работать с полем JSON.