Условно добавление в раздел Doctrine WHERE - PullRequest
0 голосов
/ 12 мая 2019

Как условно добавить ограничения к предложению WHERE?Например, если указаны sex, maxAge и minAge, предложение WHERE должно быть WHERE sex=? AND maxAge<? AND minAge>?, но если не указано maxAge, оно должно быть WHERE sex=? AND minAge>? Логика ниже может работать для определенияиспользуется ли where() или andWhere(), однако, конечно, не следует использовать.

<?php
// $qb instanceof QueryBuilder

$qb->select('u')
->from('User', 'u');

if(isset($param['sex'])) {
    $qb->where('u.sex = ?1')->setParameter(1, $param['sex']);
}

if(isset($param['maxAge'])) {
    if(isset($param['sex'])) {
        $qb->andWhere('u.age < ?2')->setParameter(2, $param['maxAge']);
    }
    else {
        $qb->where('u.age < ?2')->setParameter(2, $param['maxAge']);
    }
}

if(isset($param['minAge'])) {
    if(isset($param['sex'])|| isset($param['maxAge'])) {
        $qb->andWhere('u.age > ?3')->setParameter(3, $param['minAge']);
    }
    else {
        $qb->where('u.age > ?3')->setParameter(3, $param['minAge']);
    }
}

Ответы [ 3 ]

2 голосов
/ 12 мая 2019

Нет необходимости во всех этих условных проверках.Просто используйте andWhere везде.

<?php
// $qb instanceof QueryBuilder

$qb->select('u')
    ->from('User', 'u');

if(isset($param['sex'])) {
    $qb->andWhere('u.sex = :sex')->setParameter('sex', $param['sex']);
}

if(isset($param['maxAge'])) {
    $qb->andWhere('u.age < :maxAge')->setParameter('maxAge', $param['maxAge']);
}

if(isset($param['minAge'])) {
    $qb->andWhere('u.age > :minAge')->setParameter('minAge', $param['minAge']);
}
0 голосов
/ 12 мая 2019

Я, наверное, пойду с ответом Эхимела, но следующее должно сработать.

<?php
// $qb instanceof QueryBuilder

$qb->select('u')
->from('User', 'u');

$where = [];

if(isset($param['sex'])) {
    $where[] = $qb->expr()->eq('sex', ':sex');
}

if(isset($param['maxAge'])) {
    $where[] = $qb->expr()->lte('maxAge', ':maxAge');
}

if(isset($param['minAge'])) {
    $where[] = $qb->expr()->gte('minAge', ':minAge');
}

if($where) {
    $params=array_intersect_key($params, array_flip('sex','minAge','maxAge'));
    $qb->add('where', $qb->expr()->andX(...$where))->setParameters($params);;
}
0 голосов
/ 12 мая 2019

Полагаю, вы можете создать одну строку для where:

$whereArr = $whereParams = [];
foreach (['sex' => 'u.sex = :sex', 'maxAge' => 'u.age < :maxAge', 'minAge' => 'u.age > :minAge'] as $key => $clause) {
    if (isset($params[$key])) {
        $whereArr[] = $clause;
        $whereParams[':' . $key] = $params[$key];
    }
}

if ($whereArr) {
    $qb->where(implode(' and ', $whereArr))->setParameters($whereParams);
}
...