Робота з JSON-атрибутами за допомогою масивних кастів у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 24 грудня, 2024
Laravel пропонує функції AsArrayObject і AsCollection для ефективнішого управління складними JSON-атрибутами, що дозволяє інтуїтивно маніпулювати вкладеними структурами даних. Досліджуйте, як ці можливості трансформують управління моделями, забезпечуючи простоту та гнучкість коду!

Laravel надає касти AsArrayObject та AsCollection для ефективної роботи з комплексними JSON-атрибутами, що дозволяє інтуїтивно маніпулювати вкладеними структурами даних.

<?php

use Illuminate\Database\Eloquent\Casts\AsArrayObject;
use Illuminate\Database\Eloquent\Casts\AsCollection;

class User extends Model
{
    protected $casts = [
        'settings' => AsArrayObject::class,
        'tags' => AsCollection::class
    ];
}

Розгляньмо повний приклад моделі Product, яка використовує JSON-атрибути для управління специфікаціями та варіантами:

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
use Illuminate\Database\Eloquent\Casts\AsCollection;

class Product extends Model
{
    protected $fillable = ['name', 'specs', 'variants'];
    protected $casts = [
        'specs' => AsArrayObject::class,
        'variants' => AsCollection::class,
    ];
}

// Міграція для цієї моделі виглядатиме так:
public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->json('specs');
        $table->json('variants');
        $table->timestamps();
    });
}

// Приклад використання:
$product = Product::create([
    'name' => 'Ігровий ноутбук',
    'specs' => [
        'процесор' => 'Intel i7',
        'оперативна пам’ять' => '16GB',
        'сховище' => [
            'основне' => '512GB SSD',
            'додаткове' => '1TB HDD'
        ]
    ],
    'variants' => [
        ['color' => 'Чорний', 'price' => 999],
        ['color' => 'Сріблястий', 'price' => 1099]
    ]
]);

// Оновлюємо вкладені специфікації без жодних PHP помилок
$product->specs['сховище']['основне'] = '1TB SSD';
$product->save();
// Використовуємо методи колекцій для варіантів
$product->variants->push(['color' => 'Червоний', 'price' => 1199]);
$product->save();
// Фільтруємо варіанти за допомогою методів колекцій
$expensiveVariants = $product->variants->where('price', '>', 1000);

Ці касти забезпечують безперебійну роботу з JSON-даними, зберігаючи при цьому чистоту та легкість підтримки коду. AsArrayObject надає доступ, подібний до масиву, тоді як AsCollection відкриває можливості потужних методів колекцій Laravel