Забезпечення узгодженості атрибутів під час створення зв'язків у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 05 квітня, 2025
Хочете дізнатися, як метод `withAttributes` у Laravel підвищує цілісність зв'язків між моделями? У цій статті ми розглянемо, як цього можна досягти, автоматично застосовуючи обмеження атрибутів під час створення нових моделей

Метод withAttributes в Laravel підвищує цілісність зв'язків, автоматично застосовуючи атрибути обмеження під час створення моделей через методи зв'язків

Основна реалізація забезпечує узгодженість атрибутів:

class User extends Model
{
    // Основний зв'язок
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }

    // Обмежений зв'язок з використанням withAttributes
    public function featuredPosts(): HasMany
    {
        return $this->posts()
            ->where('featured', true)
            ->withAttributes(['featured' => true]);
    }
}

Цей підхід є особливо корисним у системах електронної комерції:

class Store extends Model
{
    public function products(): HasMany
    {
        return $this->hasMany(Product::class);
    }

    // Активні продукти з гарантованим статусом
    public function activeProducts(): HasMany
    {
        return $this->products()
            ->where('active', true)
            ->withAttributes(['active' => true]);
    }

    // Промоційні продукти з постійними атрибутами
    public function promotionalProducts(): HasMany
    {
        return $this->products()
            ->where('on_sale', true)
            ->withAttributes([
                'on_sale' => true,
                'promotion_started_at' => now()
            ]);
    }
}

Коли моделі створюються через ці зв'язки, вказані атрибути автоматично застосовуються:

// Створення через обмежений зв'язок
$newProduct = $store->promotionalProducts()->create([
    'name' => 'Літня пропозиція',
    'price' => 29.99
]);

echo $newProduct->on_sale; // true
echo $newProduct->promotion_started_at; // поточна дата та час

Метод withAttributes забезпечує узгодженість вашої моделі даних, навіть коли нові записи створюються через фільтровані методи зв'язків