---
title: "CQRS - розділення читання і запису"
url: https://laravelukraine.com/blog/cqrs-rozdilennia-citannia-i-zapisu
author: "Олексій Бабінцев"
date: 2026-08-25
---

# CQRS - розділення читання і запису

CQRS (Command Query Responsibility Segregation) розділяє операції зміни стану (команди) та операції читання (запити) на окремі моделі.

### Яку проблему вирішує

У великих доменах читання і запис мають різні вимоги: запис потребує валідації й узгодженості, а читання - швидкості та зручних для UI форм. Спільна модель змушує йти на компроміси й роздувається.

### Як вирішує

Команди (write) і запити (read) обробляються окремими класами, а інколи й окремими моделями та сховищами. Кожен бік оптимізується незалежно.

У прикладі спрощена форма CQRS. У повноцінній реалізації read-модель і write-модель можуть бути різними.

```php
class CreateOrder
{
  public function __construct(
    public int $userId, 
    public array $items
  ) {}
}

class CreateOrderHandler
{
  public function handle(CreateOrder $command): Order
  {
    return Order::create([
      'user_id' => $command->userId,
      'items' => $command->items,
    ]);
  }
}

class GetOrder
{
  public function __construct(public int $id) {}
}

class GetOrderHandler
{
  public function handle(GetOrder $query): array
  {
    return Order::query()->find($query->id)?->toArray() ?? [];
  }
}
```

### Де застосовувати

- Великі домени, де читання і запис мають різні вимоги до моделі та продуктивності.
- Системи, де читання значно переважає запис і вигідно оптимізувати його окремо.

### Плюси та мінуси

- **+** Read- і write-боки оптимізуються та масштабуються незалежно.
- **+** Чіткий поділ намірів: команди змінюють стан, запити лише читають.
- **−** Дві моделі замість однієї - більше коду й складніша синхронізація.
- **−** Для звичайного CRUD CQRS - надмірне ускладнення.
