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; } } } }