[英]How to implement a search filter form with Symfony2
我有一個要在頁面上顯示的項目列表,上面有一個搜索表單來過濾這些項目,就像在任何通常的后端一樣。 問題是我不知道如何將搜索條件添加到帶有連接的現有查詢中...這就是我所擁有的:
我在與實體關聯的存儲庫上使用特定方法來在查詢上添加聯接(以避免許多查詢)。 控制器看起來像這樣:
class ModelController extends Controller
{
public function indexAction(Request $request)
{
// ...
$em = $this->getDoctrine()->getManager();
$query = $em->getRepository('AcmeDemoBundle:Item')->getList();
}
}
存儲庫上的getList
方法如下所示:
use Doctrine\ORM\EntityRepository;
// ...
class ItemRepository extends EntityRepository
{
public function getList()
{
$queryBuilder = $this
->createQueryBuilder('i')
->innerJoin('i.brand', 'b');
return $queryBuilder->getQuery();
}
}
我創建了一個ItemSearchType
表單對象,其中包含幾個字段來搜索項目。
如何從搜索表單中提供的數據輕松添加搜索條件以顯示已過濾的項目?
這是我的控制器中有關搜索表單的內容:
class ModelController extends Controller
{
public function indexAction(Request $request)
{
// ...
if ($request->getMethod() === 'POST') {
$searchForm->bindRequest($request);
if ($searchForm->isValid()) {
$searchCriteria = $searchForm->getData();
// Do something with this data! ...but I don't know how
}
}
}
謝謝!
這是我會嘗試的:
public function getListBy($criteria)
{
$qb = $this->createQueryBuilder('i');
$qb->innerJoin('i.brand', 'b');
foreach ($criteria as $field => $value) {
if (!$this->getClassMetadata()->hasField($field)) {
// Make sure we only use existing fields (avoid any injection)
continue;
}
$qb ->andWhere($qb->expr()->eq('i.'.$field, ':i_'.$field))
->setParameter('i_'.$field, $value);
}
return $qb->getQuery()->getResult();
}
在這里我發布了一個答案 ,我使用了LexikFormFilterBundle filterTypes和QueryBuilder,以及我創建的TypeGuesser,它抽象了filterForm的創建過程。
您可以將這兩個服務作為單獨的Bundle與Composer一起安裝。 生成的代碼更清晰
從README,如果您不想導航到github:P
/**
* Creates a Filter form to search for Entities.
*
* @param AbstractType|string $formType The `generate:doctrine:form` generated Type or its FQCN.
*
* @return \Symfony\Component\Form\Form The filter Form
*/
private function createFilterForm($formType)
{
$adapter = $this->get('dd_form.form_adapter');
$form = $adapter->adaptForm(
$formType,
$this->generateUrl('document_search'),
array('fieldToRemove1', 'fieldToRemove2')
);
return $form;
}
SF> = 2.8需要修復此處
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.