Как сделать удобный метод выборки данных (Yii)?

Здравствуйте. Скажите пожалуйста, как сделать метод для выбора данных в стиле MVC, что бы его бы легко удобно применять и просто расширять.
Мой вариант:
/**
 * Менеджер подзадач
 */
class SubtasksManager
{
        /**
          * Получение подзадач
          */
	public function getSubtasks($params = [])
	{
		$subtasksCriteria = new CDbCriteria;

		/*
		 * Фильтрация по предопределённым критериям
		 */
		// Получение задач ожидающих выполнения
		if (!empty($params['requires_performing'])) {
			// Только выполняемые задачи (есть ещё связующие)
			$params['type'] = '1';
			// Задачи ожидающие выполнения
			$params['performing_status'] = '1';
		}

		// Получение только задач в стадии подготовки
		if (!empty($params['preparing'])) {
			$params['performing_status'] = '0';
		}

		/*
		 * Фильтрация по определённым полям
		 */
		// Получение по идентификатору родительской задачи
		if (!empty($params['task_id'])) {
			$subtasksCriteria->addColumnCondition(['task_id' => $params['task_id']]);
		}

		// Получение по типу
		if (!empty($params['type'])) {
			$subtasksCriteria->addColumnCondition(['type' => $params['type']]);
		}

		// Получение по статусу выполнения
		if (!empty($params['performing_status'])) {
			$subtasksCriteria->addColumnCondition(['performing_status' => $params['performing_status']]);
		}

		return SubtasksAr::model()->findAll($subtasksCriteria);
	}

В этом методе есть возможность получать как по предопределённым критериям, так и по определённым полям таблицы.
Вопросы:
1. Правильный ли это подход или лучше убрать получение по определённым полям таблицы из вне, ведь теряется гибкость скрипта, вдруг изменится название какого-то поля, тогда придётся менять его название во всей системе, в каждом файле.

2. Если например мне нужны получить подзадачи по определённому родителю, то в параметрах метода лучше получать только идентификатор родительской задачи или целый объект со всеми его данными? Второй вариант кажется более гибким.

Хочу узнать, правильно ли идёт ход моих мыслей или это очередной быдлокод
  • Вопрос задан
  • 2525 просмотров
Пригласить эксперта
Ответы на вопрос 1
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
В MVC выборка дынных производится в моделях. Соответственно, всё, что ты написал в "менеджере подзадач", должно быть размещено в соответствующей модели. Если тебе нужен дополнительный механизм выборки данных - создаешь новый метод в модели. Именно модели должны отображать структуру данных и связей.

В Yii достаточно мощная Active Record, позволяющая гибко выбирать данные из дочерних таблиц без дополнительных ухищрений. При правильной настройке связей в моделях подзадачи заданного родителя вполне можно получить так: Task::model()->findByPk($id)->Subtask.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы