Zend Framework 2 и построитель запросов для доктрины

Я пытаюсь написать запрос, используя построитель запросов доктрины, на основе параметров, которые я получаю из массива.

Вот мой массив,

$query = array('field' => 'number,
                            'from' => '1',
                                'to'  => '100',
                                    'Id' => '2',
                                        'Decimation' => '10'
                           );

Запрос, который я пытаюсь написать,

select * from table where (number between 1 AND 100) AND (Id = 2) AND number mod 10 = 0

Вот где я стою сейчас,

if (is_array($parameters['query'])) {
        $queryBuilder->select()
                      ->where(
                              $queryBuilder->expr()->between($parameters['query']['field'], $parameters['query']['from'], $parameters['query']['to']),
                              $queryBuilder->expr()->eq('Id', '=?1'),
                              $queryBuilder->expr()->eq($parameters['query']['field'],'mod 10 = 0') 
                            )
                     ->setParameter(array(1 => $parameters['query']['Id']));
    }

Я просто не могу уложить это в голове, почему-то. Помощь !! кто угодно?


person golldy    schedule 21.11.2013    source источник


Ответы (2)


Не проверено или что-то в этом роде, просто введено непосредственно в поле ответа SO:

$queryBuilder->select('table')
    ->from('My\Table\Entity', 'table')
    ->where($queryBuilder->expr()->andX(
        $queryBuilder->expr()->between('table.number', ':from', ':to'),
        $queryBuilder->expr()->eq->('table.id', ':id'),
    ))
    ->andWhere('MOD(table.number, :decimation) = 0')
    ->setParameters(array(
        'from' => $parameters['query']['from'],
        'to' => $parameters['query']['to'],
        'id' => $parameters['query']['id'],
        'decimation' => $parameters['query']['decimation']
   ));

Он не позволяет динамически устанавливать, к какому полю применять условие «где». Однако это, скорее всего, плохая идея без внесения в белый список значений, которые вы хотите разрешить. Как только это будет сделано, выполните простую модификацию приведенного выше кода (просто интерполируйте значение вместо number в строке table.number).

person Tomdarkness    schedule 21.11.2013

Я вроде понял,

Основная идея здесь заключалась в использовании предложения andWhere. Множественные предложения where были тем, что я хотел. и оператор мода, который дает доктрина. Сработало очень хорошо. Между тем требования также изменились.

person golldy    schedule 22.11.2013
comment
Вы даже проверили мой ответ, который описывает именно это? - person Tomdarkness; 23.11.2013