Symfony 使用 Ajax 和 jquery 进行高级搜索

Posted

技术标签:

【中文标题】Symfony 使用 Ajax 和 jquery 进行高级搜索【英文标题】:Symfony advanced search with Ajax and jquery 【发布时间】:2021-06-09 20:05:44 【问题描述】:

我想使用 ajax 实现搜索,但是我一直遇到这个错误:

实体“App\Entity\Repas”没有字段“字符串”。因此,您不能 在实体的存储库上调用“findBystring”。

我尝试更改函数的名称,但它说它应该以findBy 开头,我不知道还有哪里可以老实说。 控制器代码:

use App\Entity\Repas;
use App\Form\RepasType;
use App\Repository\RepasRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\DependencyInjection\ContainerInterface;

public function searchAction(Request $request)
  
    $repository = $this->getDoctrine()->getRepository(repas::class);
    $requestString= $request->get('searchValue');
    $repas = $repository->findBystring($requestString);
    $jsonContent = $Normalizer->normalize($repas, 'json',['groups'=>'repas']);
    $retour=json_encode($jsonContent);
    return new Response($retour);

  

Doctrine Repository 功能:

public function findByString($nom)
        return $this->createQueryBuilder('repas')
            ->where('repas.nom like :nom')
            ->setParameter('nom', '%'.$nom.'%')
            ->getQuery()
            ->getResult();
    

树枝代码:

<h1 id="dd1"> List</h1>
</br>
<div style="margin-right:50px;" class="btn btn-primary">
    <a href="#"> Add</a>
</div>
</div>
<input type="text" id="search" class="form-control" placeholder="Search">
<div>
    <table border="1" id="t" class="table table-hover table-dark">
        <thead class="thead-dark">
            <tr>
                <td>ID</td>
                <td>Nom</td>
                <td>desc</td>
            </tr>
        </thead>
        <tbody id="all">
            % for repa in repas %
            <tr>
                <td>
                     repa.id 
                </td>
                <td>
                     repa.nom 
                </td>
                <td>
                     repa.desc 
                </td>
            </tr>
            % endfor %
        </tbody>
        <tbody id="search"></tbody>
    </table>
</div>

javascript 代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    $(document).ready(function() 
        $("#search").keyup(function(e) 

            var value = $(this).val();

            $.ajax(
                url: " path('list') ",
                type: 'GET',
                data: 
                    'searchValue': value
                ,
                success: function(retour) 
                    if (retour) 
                        $('#t tbody#search').empty();
                        $.each(JSON.parse(retour), function(i, obj) 
                            $('#t tbody#all').hide();
                            $('#t tbody#search').append('<tr><td> ' + obj.id + '  </td><td>    ' + obj.nom '  </td><td>' + obj.desc + ' </td><td><a href="#/' + obj.id + '">update</a> </br><a href="#/' + obj.id + '">Delete</a></td></tr>');
                        );
                     else 
                        $('#t tbody#all').show();
                        $('#t tbody#search').empty();
                        $('#t tbody#search').fadeIn('fast');
                    
                ,
            );
            return false;
        );
    );
</script>

【问题讨论】:

【参考方案1】:

这是一个错字/大写错误!

您在存储库中定义了一个名为 findByString() 的函数,在您的控制器中,您将其称为 findBystring()

在您的控制器内部更改:

$repas = $repository->findBystring($requestString);

收件人:

$repas = $repository->findByString($requestString);

【讨论】:

【参考方案2】:

未调用您的存储库 RepasRepository,因此无法识别您的功能。这是您的动作主体的更正:

$repository = $this->getDoctrine()->getRepository(RepasRepository::class); // repa => RepasRepository
$requestString= $request->get('searchValue');
$repas = $repository->findByString($requestString);  // findBystring => findByString
$jsonContent = $Normalizer->normalize($repas, 'json',['groups'=>'repas']);
$retour=json_encode($jsonContent);
return new Response($retour);

【讨论】:

【参考方案3】:

尝试使用findBy 和这样的语法:

$repository->findBy(['nom'=> $requestString]);

那个 hovewer 将只返回与字符串完全匹配的实体。

您是否尝试过重命名存储库方法?

【讨论】:

不,实际上我还是 symfony 的新手,我在理解一切方面遇到了一些问题 好的,我的意思是将您在此处使用的 findByString 方法重命名为 findRepasByNameLike 之类的其他名称(只是一个示例),但我认为下面的答案是正确的,您有一个控制器代码中的拼写错误。

以上是关于Symfony 使用 Ajax 和 jquery 进行高级搜索的主要内容,如果未能解决你的问题,请参考以下文章

将产品添加到购物车 jQuery/Ajax/Symfony/Twig

Symfony CSRF 和 Ajax

带有 CSRF 的 Symfony2 表单通过 JQuery AJAX 传递

JQuery:$.ajax 不是函数

使用 ajax 和 Symfony2 上传文件

我正在尝试使用 ajax 和 symfony 上传文件