Существует замечательный пакет под названием LexikFormFilterBundle "lexik/form-filter-bundle": "~2.0"
, который помогает генерировать сложный DQL после заполнения пользователем формы фильтра.
Я создал пакет, который зависит от него, который меняет типыданный FormType (например, сгенерированный SencioGeneratorBundle) Таким образом, вы можете отобразить правильную FilterForm и затем создать DQL после него (с Lexik).
Вы можете установить его с помощью Composer, следуя этому README.md
Все, что он делает, это переопределяет Guesser Type Doctrine, который предлагает требуемый FormType для каждого поля Entity, и заменяет данный Type на соответствующий LexikFormFilterType.Например, заменяет простой NumberType
на filter_number
, который отображает в виде двух чисел, границ Max и Min.
private function createFilterForm($formType)
{
$adapter = $this->get('dd_form.form_adapter');
$form = $adapter->adaptForm(
$formType,
$this->generateUrl('document_search'),
array('fieldToRemove1', 'fieldToRemove2')
);
return $form;
}
После отправки формы вы просто передаете ее Lexik и запускаете сгенерированный запрос, как показано в моем примере.
public function searchAction(Request $request)
{
// $docType = new FormType/FQCN() could do too.
$docType = 'FormType/FQCN';
$filterForm = $this->createFilterForm($docType);
$filterForm->handleRequest($request);
$filterBuilder = $this->getDocRepo($docType)
->createQueryBuilder('e');
$this->get('lexik_form_filter.query_builder_updater')
->addFilterConditions($filterForm, $filterBuilder);
$entities = $filterBuilder->getQuery()->execute();
return array(
'entities' => $entities,
'filterForm' => $filterForm->createView(),
);
}