Приложение имеет страницу статистики, представляющую десятки расчетов.Чтобы избежать дублирования кода в репозитории, ошибка
Ошибка: 'c' используется вне области его объявления
возникает при попытке вставить DQL с условиями вQueryBuilder.
Основными объектами являются Домохозяйство и Контакт.Расчеты основаны на диапазоне дат контакта, месте (место контакта) и типе (тип контакта).Существует служба, которая создает массив операторов where и параметров запроса, как будет видно из приведенного ниже кода.
Я знаю, что расчет работает, если весь код выполняется в одной функции.Кажется, проблема возникает из-за объединения с объектом Contact и его необходимыми ограничениями.Можно ли выполнить DRY в этом сценарии?
В хранилище сущности домохозяйства появляется все следующее:
DQL:
private function reportHousehold($criteria)
{
return $this->createQueryBuilder('i')
->select('i.id')
->join('TruckeeProjectmanaBundle:Contact', 'c', 'WITH',
'c.household = i')
->where($criteria['betweenWhereClause'])
->andWhere($criteria['siteWhereClause'])
->andWhere($criteria['contactWhereClause'])
->getDQL()
;
}
Пример $ критерия: $criteria['betweenWhereClause'] = 'c.contactDate BETWEEN :startDate AND :endDate'
Один из расчетов по домашнему хозяйству:
public function res($criteria)
{
$parameters = array_merge(
$criteria['betweenParameters'], $criteria['siteParameters'],
$criteria['startParameters'], $criteria['startParameters'],
$criteria['contactParameters']);
$qb = $this->getEntityManager()->createQueryBuilder();
return $this->getEntityManager()->createQueryBuilder()
->select('h.id, 12*(YEAR(:startDate) - h.arrivalyear) + (MONTH(:startDate) - h.arrivalmonth) Mos')
->from('TruckeeProjectmanaBundle:Household', 'h')
->distinct()
//DQL inserted here:
->where($qb->expr()->in('h.id', $this->reportHousehold($criteria)))
->andWhere($qb->expr()->isNotNull('h.arrivalyear'))
->andWhere($qb->expr()->isNotNull('h.arrivalmonth'))
->andWhere($criteria['startWhereClause'])
->setParameters($parameters)
->getQuery()->getResult()
;
}