Doctrine - Как использовать столбец подзапроса (в условии SELECT и при наличии условия) - PullRequest
1 голос
/ 03 марта 2020

Здравствуйте, я пытаюсь переписать конструктор запросов ZF в doctrine ORM.

Вот мой старый запрос Zend Framework.

$dependent = new Zend_Db_Expr('if(br.billing_rate = \'dependent\',(SELECT COUNT(*) FROM childcare_billing_rule_price AS p WHERE p.id < brp.id AND p.childcare_billing_rule_id = brp.childcare_billing_rule_id),0)');

$select = $this
    ->select()->setIntegrityCheck(false)
    ->from(array('brg' => 'childcare_billing_rule_group'), array())
    ->joinInner(array('br' => 'childcare_billing_rule'), 'br.id = brg.billing_rule_id', array('*', 'dependent' => $dependent))
    ->join(array('brp' => 'childcare_billing_rule_price'), 'br.id = brp.childcare_billing_rule_id', array('age_from', 'age_to', 'default_rate' => 'rate'))
    ->where('is_default != 1')
    ->where('br.billing_type in (\'' . implode('\',\'', array(self::BILLING_TYPE_PER_DAY, self::BILLING_TYPE_PER_HOUR, self::BILLING_TYPE_PER_UNLIMITED, self::BILLING_TYPE_PER_RESERVATION)) . '\')')
    ->where('brg.group_id IN (?)', $groupId)
    ->group('brp.id')
    ->having('dependent <= ?', $dependentLevel)
    ->order('dependent desc')
    ->order('brp.rate');

И вот оно SQL значение строки

SELECT `br`.*, 
 if (br.billing_rate = 'dependent', 
    (SELECT COUNT(*) FROM childcare_billing_rule_price AS p WHERE p.id < brp.id AND p.childcare_billing_rule_id = brp.childcare_billing_rule_id),
 0) AS `dependent`, 
 `brp`.`age_from`, 
 `brp`.`age_to`, 
 `brp`.`rate` AS `default_rate` 

 FROM `childcare_billing_rule_group` AS `brg`

 INNER JOIN `childcare_billing_rule` AS `br` ON br.id = brg.billing_rule_id

 INNER JOIN `childcare_billing_rule_price` AS `brp` ON br.id = brp.childcare_billing_rule_id 
 WHERE (is_default != 1) 
 AND (br.billing_type in ('Per Day','Per Hour','Unlimited','Per Reservation')) 
 AND (brg.group_id IN (103)) 
 AND ((brp.age_from = 0 AND brp.age_to = 0) || 3.1666666666667 
 BETWEEN brp.age_from AND brp.age_to) 
 GROUP BY `brp`.`id` HAVING (dependent <= '0') 
 ORDER BY `dependentw` desc, 
 `brp`.`rate` ASC

Я не уверен, как реализовать этот подзапрос

 new Zend_Db_Expr('if(br.billing_rate = \'dependent\',(SELECT COUNT(*) FROM childcare_billing_rule_price AS p WHERE p.id < brp.id AND p.childcare_billing_rule_id = brp.childcare_billing_rule_id),0)');

Пока мой код

$subQuery = $subQueryBuilder
    ->select('if (br.billing_rate = 'dependent', 
(SELECT COUNT(*) FROM childcare_billing_rule_price AS p WHERE p.id < brp.id AND p.childcare_billing_rule_id = brp.childcare_billing_rule_id)')
    ->getSQL();

 $queryBuilder->select($alias)
    ->addSelect($subQuery)
    ->innerJoin(ChildcareBillingRule::class, 'br', Join::WITH, 'br.id = childcare_billing_rule_group.childcareBillingRule')
    ->innerJoin(ChildcareBillingRulePrice::class, 'brp', Join::WITH, 'br.id = brp.childcareBillingRule')
    ->where("br.billingType in (:billingTypes)")
    ->andWhere(  'br.isDefault != :isDefault')
    ->andWhere(  'childcare_billing_rule_group.groupId in (:groupId)')
    ->setParameter('groupId', [103])
    ->setParameter('isDefault', 1)
    ->setParameter('billingTypes', ['Per Hour', 'Per Reservation', 'Per Day', 'Unlimited'])
    ->having('dependent <= ?', $dependentLevel')
    ->groupBy('brp.id')
    ->orderBy('brp.rate') ;
    ->getQuery()->getSingleResult();

, поэтому я пытается добавить подзапрос с помощью addSelect, но не уверен, что это правильный путь? Любая Помощь или идея ценится? Tnx

1 Ответ

0 голосов
/ 05 марта 2020
Короче

вместо -> get SQL () вы должны использовать -> getDQL ().

Ваш код будет выглядеть так:

$dql = $this->createQueryBuilder()
   ->select('count(id)')
   ->from({Class::FQDN}, {ALIAS})
   ->getDQL();
$result = $this->createQueryBuilder()
   ->select({SECOND_ALIAS})
   ->from({SecondClass::FQDN}, {SECOND_ALIAS})
   ->where((new \Expr())->gt('{SECOND_ALIAS}.cnt', $dql))
   ->getQuery()
   ->getResult();
...