【问题标题】:Symfony2 Searching Database with Select2 and AjaxSymfony2 使用 Select2 和 Ajax 搜索数据库
【发布时间】:2017-02-02 23:48:33
【问题描述】:

我的常见问题解答系统运行良好,但我想在 Select2 中加入搜索功能。

到目前为止我得到了什么:

Select2 AJAX 脚本

    <script>
    $("#searchall").select2({
        ajax: {
            url: "/ajax/searchallSelect2",
            dataType: 'json',
            delay: 250,
            data: function (params) {
                return {
                    q: params.term, // search term
                    page: params.page
                };
            },
            processResults: function (data, params) {
                // parse the results into the format expected by Select2
                // since we are using custom formatting functions we do not need to
                // alter the remote JSON data, except to indicate that infinite
                // scrolling can be used
                params.page = params.page || 1;

                return {
                    results: data.items,
                    pagination: {
                        more: (params.page * 30) < data.total_count
                    }
                };
            },
            cache: true
        },
        escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
        minimumInputLength: 1,
    });

AjaxController.php

    /**
 * @Route("/ajax/searchallSelect2", name="ajax_searchall_select2")
 */
public function searchallSelect2Action(Request $request)
{
    dump($request);
    exit;
    return $this->render('', array('name' => $name));
}

“index.html.twig”中的Select2表单

    <select id='searchall' style="width: 300px">
</select>

在 select2 搜索字段中输入后的 Firebug 控制台输出:

GET http://localhost:8000/ajax/searchallSelect2?q=test 200 OK 16ms

我的问题是,如何实现数据库搜索?只需在 AjaxController 中使用 getRepository?

        $allfaqs = $this->getDoctrine()
    ->getRepository('AppBundle:Faq')
        ->findAll();

或者我需要在 Ajax 脚本中搜索数据库吗?

非常感谢您的帮助,感谢您的阅读!

【问题讨论】:

    标签: javascript php ajax symfony doctrine


    【解决方案1】:

    由您在控制器或 repository(推荐)中编写 queryBuilder 并在控制器中调用它。你不应该在你的存储库中调用-&gt;findAll(),因为它会得到你不需要的所有数据。您需要根据来自 ajax 的请求查询参数过滤数据,即?q=test。下面是控制器的代码 sn-p。

    在您的控制器中:

    /**
     * @Route("/ajax/searchallSelect2", name="ajax_searchall_select2")
     */
    public function searchallSelect2Action(Request $request)
    {
        $key = $request->query->get('q'); 
    
        // Find rows matching with keyword $key..
    
        $allfaqs = $this->getDoctrine()
        ->getRepository('AppBundle:Faq')->filterByKey($key);
    
        // customize your output as per Select2 requirement..
        return new JsonResponse($allfaqs);
    }
    

    在您的存储库中:(考虑到您在常见问题解答中搜索“名称”属性。)

    /**
     * @param string $key
     *
     * @return type
     */
    public function filterByKey($key)
    {
        $qb = $this->createQueryBuilder('faq')
            ->andWhere('faq.name LIKE :key')
            ->setParameter('key', '%' . $key . '%')
            ->getQuery();
    
        return $qb->getQuery()->execute();
    }
    

    希望对您有所帮助!否则,请告诉我您的疑虑。

    【讨论】:

      【解决方案2】:

      谢谢,我在 10 分钟前就解决了,但非常感谢您的帮助。

      我的 Select2 现在正在搜索 FAQ 问题、答案以及与 Faq (ManyToMany) 链接的标签。

      运作良好。

      也许有人会需要这个:

         /**
       * @Route("/ajax/searchallSelect2", name="ajax_searchall_select2")
       */
      public function searchallSelect2Action(Request $request)
      {
          $em = $this->getDoctrine()->getManager();
          $query = $em->createQuery(
              'SELECT c
              FROM AppBundle:Faq c WHERE c.question LIKE \'%'.$request->get('q').'%\' OR c.answer LIKE \'%'.$request->get('q').'%\'');
      
          $query2 = $em->createQuery(
              'SELECT c
              FROM AppBundle:Tag c WHERE c.name LIKE \'%'.$request->get('q').'%\'');
          $faqs = $query->getResult();
          $tmpTags = $query2->getResult();
          $returnArray = [];
          $tmpReturns = array();
          foreach($faqs as $faq) {
              $tmpReturns[$faq->getId()] = $faq;
          }
          foreach($tmpTags as $tmpTag) {
              foreach($tmpTag->getFaqs() as $tmpFaq) {
                  if(!isset($tmpReturns[$tmpFaq->getId()])) {
                      $tmpReturns[$tmpFaq->getId()] = $tmpFaq;
                  }
              }
          }
      
          foreach ($tmpReturns as $faq)
          {
              /** @var $faq Faq */
              $tags = array();
              foreach($faq->getTags() as $tag) {
                  /** @var $tag Tag */
                  $tags[] = $tag->getName();
              }
              $returnArray[] = array(
                  'id' => $faq->getId(),
                  'text' => 'Titel => '. $faq->getQuestion(). ' '
                      . 'Inhalt: '. $faq->getAnswer(). ' '
                      . '('.implode(', ', $tags).')'
              );
          }
      
          return new JsonResponse($returnArray);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-30
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多