Как хранить данные JSON в базе данных в Laravel (с примерами)

Источник: «How to Store JSON Data in Database in Laravel (With Example)»
Хранение данных JSON в базе данных Laravel обеспечивает гибкое решение для управления динамическими атрибутами или неструктурированными данными.

В этом руководстве мы рассмотрим процесс хранения данных JSON в базе данных Laravel на практическом примере хранения атрибутов товара. К концу этого руководства у вас будет чёткое понимание того, как эффективно хранить и извлекать данные JSON с помощью Laravel.

Шаг 1. Настройка Laravel проекта

Создайте новый Laravel проект используя следующую команду:

laravel new json-data-storage

или

composer create-project laravel/laravel json-data-storage

Шаг 2. Создание миграции таблицы products

Сгенерируйте файл миграции для создания таблицы products с помощью команды artisan:

php artisan make:migration create_products_table --create=products

Внутри сгенерированного файла миграции database/migrations/YYYY_MM_DD_create_products_table.php задайте схему таблицы с колонкой JSON для атрибутов:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/

public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->json('attributes');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/

public function down(): void
{
Schema::dropIfExists('products');
}
};

Шаг 3. Запуск миграции

Примените миграцию следующей командой:

php artisan migrate

Шаг 4. Создание Модели Product

Сгенерируйте модель следующей командой:

php artisan make:model Product

В Модели Product (app/Models/Product.php), добавьте свойство $casts, чтобы указать, что атрибут attributes должен обрабатываться как JSON:

/app/Models/Product.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
use HasFactory;

protected $casts = [
'attributes' => 'json',
];
}

Шаг 5. Хранение Атрибутов Product в формате JSON

Для хранения атрибутов Product в формате JSON мы можем просто использовать модель Laravel Eloquent. Создайте новый экземпляр Product, задайте нужные атрибуты в виде массива и сохраните его:

use App\Models\Product;

$product = new Product;
$product->attributes = [
'color' => 'red',
'size' => 'medium',
'weight' => 0.5,
];
$product->save();

Шаг 6. Получение данных JSON

Чтобы получить атрибуты Product, вы можете обратиться к свойству attributes модели:

$product = Product::find(1);
$attributes = $product->attributes;

Если хотите получить доступ к определённому атрибуту в данных JSON, вы можете сделать это, используя доступ к массиву:

$color = $product->attributes['color'];

Обратившись к свойству attributes, вы можете получить данные JSON, связанные с Product, и получить доступ к определённым атрибутам по мере необходимости.

Шаг 7. Манипулирование данными JSON (полный массив)

Чтобы обновить все атрибуты Product сразу, вы можете присвоить новый массив со всеми парами ключ-значение и использовать метод save() Eloquent для прямого обновления записи.

$product = \App\Models\Product::find(1);
$product->attributes = [
'color' => 'green',
'size' => 'large',
'weight' => 2.5,
];
$product->save();

Шаг 8. Манипулирование данными JSON (одно значение)

Обновление одного значения в данных JSON требует несколько иного подхода в Laravel и имеет одну важную оговорку. Прямое изменение атрибута, например, $product->attributes['weight'] = 1.0 и сохранение Product приведёт к ErrorException: Indirect modification of overloaded property App\Models\Product::$attributes has no effect.

Чтобы решить эту проблему, вы можете воспользоваться приведённым ниже решением:

$product = \App\Models\Product::find(1);
$attributes = $product->attributes; // создаём копию массива
$attributes['weight'] = 0.6; // изменяем значение в скопированном массиве
$product->attributes = $attributes; // присваиваем скопированный массив обратно в $product->attributes
$product->save();

Заключение

Хранение данных JSON в базе данных с помощью Laravel обеспечивает гибкость и удобство при работе с динамическими или неструктурированными данными. Следуя шагам, описанным в этом руководстве, вы научились создавать необходимые миграции и модели, хранить и получать данные JSON, а также эффективно манипулировать данными JSON. Эти знания дадут инструменты для решения различных задач в ваших приложениях Laravel и откроют возможности для эффективного управления сложными структурами данных.

Начните внедрять хранение данных JSON в свои проекты Laravel и раскройте весь потенциал возможностей управления данными в вашем приложении. Счастливого кодинга!

Дополнительные материалы

Предыдущая Статья

Варианты использования Web Storage API в HTML

Следующая Статья

Record и Tuple в JavaScript