【问题标题】:Symfony create a search formSymfony 创建一个搜索表单
【发布时间】:2019-03-27 21:36:11
【问题描述】:

我是来找你帮忙的,因为我想制作一个搜索表单,但我在控制器上阻止了

我的问题是如何在get中制作表格?

我把我的代码分享给你

我的控制器:

/**
 * @Route({"fr": "/recherche/search/?value={value}&region={region}&category={category}",
 *         "en": "/search/",
 *         "es": "/buscar/"}, name="search", methods="GET")
 * @param Request $request
 * @param string $value
 * @param string $region
 * @param string $category
 * @return Response
 * @throws \Exception
 */
public function searchAction(Request $request, string $value, string $region, string $category): Response
{
    $form = $this->createForm(SearchType::class);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid())
    {
        $value = $form->getData()->getTitle();
        $search = $this->getDoctrine()->getRepository(Advertisement::class)->findBySearch($value, $region, $category);

        return $this->render('search/result.html.twig', [
            'results' => $search
        ]);
    }
    return $this->render('search/search.html.twig', [
        'form' => $form->createView()
    ]);

}

在我的存储库中我需要这个查询:

SELECT * FROM `advertisement` 
WHERE category_id = 7 
    AND region_id = 1 
    AND title LIKE '%iph%' 
    OR description LIKE 'test'

我的仓库:

/**
 * @return Advertisement|null
 * @param string $value
 * @param $region
 * @param $category
 * @throws \Exception
 */
public function findBySearch(string $value, $region, $category)

{
    $query = $this->createQueryBuilder('a')
    ->addSelect('a')
    ->where('a.category = :category')
    ->andWhere('a.region = :region')
    ->andWhere('a.title LIKE :value')
    ->orWhere('a.description LIKE :value')
    ->setParameter(':value', $value)
    ->setParameter(':region', $region)
    ->setParameter(':category', $category)
    ->getQuery();

    try {
        return $query->getResult();
    }
    catch(\Exception $e) {
        throw new \Exception('problème '. $e->getMessage(). $e->getFile());
    }
}

感谢您的帮助!

【问题讨论】:

    标签: php forms symfony url


    【解决方案1】:

    你可以在创建的时候设置form方法(https://symfony.com/doc/current/form/action_method.html),试试这样的

    ...    
    public function searchAction(Request $request, string $value, string $region, string $category): Response
    {
       $form = $this->createForm(SearchType::class, ['method' => Request::METHOD_GET]);
       $form->handleRequest($request);
            ...
    

    【讨论】:

    • 我在我的 formTyp 中添加了这个 ->setAction($this->router->generate('search')) ->setMethod('GET')
    • 你能告诉我更多吗?你的问题到底是什么?
    • 我收到这条消息:(“无法猜测如何从参数“region”的请求信息中获取 Doctrine 实例。”)。
    • 这是另一个问题,您正在尝试将 url 参数“区域”“转换”为 Doctrine 实体,在函数参数中使用 $string 区域
    【解决方案2】:

    试试这个,我假设区域和类别是对立的

    /**
     * @Route({"fr": "/recherche/search/?value={value}&region={region}&category={category}",
     *         "en": "/search/",
     *         "es": "/buscar/"}, name="search", methods="GET")
     * @param Request $request
     * @param string $value
     * @param string $region
     * @param string $category
     * @return Response
     * @throws \Exception
     */
    public function searchAction(Request $request, string $value, Region $region, category $category): Response
    {
        $form = $this->createForm(SearchType::class, null, [
            'method' => 'GET'
        ]);
        $form->handleRequest($request);
    
        if ($form->isSubmitted() && $form->isValid())
        {
            $value = $form->getData()->getTitle();
            $search = $this->getDoctrine()->getRepository(Advertisement::class)->findBySearch($value, $region, $category);
    
        return $this->render('search/result.html.twig', [
            'results' => $search
        ]);
    }
    return $this->render('search/search.html.twig', [
        'form' => $form->createView()
    ]);
    
    }
    
    public function findBySearch(string $value, Region $region, Category $category)
    
    {
    return $this->createQueryBuilder('a')
        ->where('a.category = :category')
        ->andWhere('a.region = :region')
        ->andWhere('a.title LIKE :value')
        ->orWhere('a.description LIKE :value')
        ->setParameters([
            'value' => $value,
            'region' => $region,
            'category' => $category
        ])
        ->getQuery()
        ->getResult();
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2015-01-18
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多