exampleapp/modules/Tasks/Infrastructure/Storage/TasksStorage.php

91 lines
3.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Modules\Tasks\Infrastructure\Storage;
use Modules\Src\TraitStorage;
use Modules\Tasks\Infrastructure\DBQueries\TasksQuery;
use Modules\Tasks\Infrastructure\OtherQueries\OtherQuery;
/**
* Класс TasksStorage - репозиторий для работы с задачами.
* Обеспечивает:
* - Получение списка задач с пагинацией
* - Получение конкретной задачи по ID
* - Загрузку дополнительных связанных данных
*/
class TasksStorage
{
// Используем трейт с общими методами работы с хранилищем
use TraitStorage;
// Запросы к основной таблице задач
private TasksQuery $tasksQuery;
// Запросы для получения дополнительных данных
private OtherQuery $otherQuery;
/**
* Установка сервиса запросов к задачам
*/
public function setTasksQuery(TasksQuery $query): void
{
$this->tasksQuery = $query;
}
/**
* Установка сервиса запросов к дополнительным данным
*/
public function setOtherQuery(OtherQuery $query): void
{
$this->otherQuery = $query;
}
/**
* Получение списка задач с пагинацией
*
* @param int $limit - количество записей
* @param int $offset - смещение
* @param array $dsl - запрашиваемые поля и прочие правила для сборки данных (включая дополнительные данные)
* @return array - массив задач
*/
public function getList(int $limit, int $offset, array $dsl = []): array
{
$data = $this->tasksQuery->select($dsl)->limit($limit, $offset)->all();
$this->receiveAdditionalData($data, $dsl);
return $data;
}
/**
* Получение задачи по ID
*
* @param string $id - идентификатор задачи
* @param array $dsl - запрашиваемые поля и прочие правила для сборки данных
* @return array - данные задачи
*/
public function getById(string $id, array $dsl): array
{
$data = $this->tasksQuery->select($dsl)->whereId($id)->all();
$this->receiveAdditionalData($data, $dsl);
return array_pop($data) ?? [];
}
/**
* Загрузка дополнительных данных для задач
*
* @param array &$data - ссылка на массив задач (для модификации)
* @param array $dsl - запрашиваемые поля и прочие правила для сборки данных (определяет какие данные подгружать)
*/
private function receiveAdditionalData(array &$data, array $dsl): void
{
if (in_array('options', $dsl)) {
$tasksIds = $this->pluck('id', $data);
$otherData = $this->otherQuery->getForTasks($tasksIds);
foreach ($data as &$row) {
// $myOtherData = $otherData[$row['id']] ?? []; // Правильная реализация была бы такой
$myOtherData = $otherData[0]; // Текущая упрощенная реализация
$row['options'] = $myOtherData;
}
}
}
}