Как хранить данные 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 и раскройте весь потенциал возможностей управления данными в вашем приложении. Счастливого кодинга!