首页 > 解决方案 > 我正在尝试使用教义和查询生成器在 symfony 中创建列表过滤器

问题描述

我正在尝试在 Symfony 中构建一个列表过滤器。我对 PHP、MySQL 和 Twig 还是很陌生。官方文档并没有太大帮助。我需要有一个包含所有类列表的页面,并且在该页面旁边有一个搜索栏,用户在其中输入他们想要的类,它将显示在页面上而没有其他类。我会发布我的代码,但我认为它缺少很多代码。我只需要很少的帮助,并且可能需要有关如何执行此操作的文档来源,对于零经验的人来说,官方文档并不是很清楚。

我的 ClassesRepository.php

<?php

namespace App\Repository;

use App\Entity\Classes;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

/**
 * @method Classes|null find($id, $lockMode = null, $lockVersion = null)
 * @method Classes|null findOneBy(array $criteria, array $orderBy = null)
 * @method Classes[]    findAll()
 * @method Classes[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class ClassesRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Classes::class);
    }


    public function findbyName()
    {
        return $this->createQueryBuilder('c')
        ->getQuery()->getResult();
    }

    public function getSearchClasses($class){

        $qb = $this->createQueryBuilder('c')
                   ->where('c.Title LIKE :Title')
                   ->setParameter('Title', '%' . $class->getTitle() . '%')
                   ->orderBy('c.Title', 'DESC')
                   ->getQuery();
    }
}

类控制器:

<?php

namespace App\Controller;

use App\Entity\Classes;
use App\Entity\Students;
use App\Entity\Courses;
use Symfony\Component\Form\FormTypeInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;


class ClassesController extends AbstractController
{
    /**
     * @Route("custom/classes", name="classes_list")
     */
    public function index()
    {
        $classes = $this->getDoctrine()->getRepository(classes::class)->findAll();
        return $this->render('classes/index.html.twig', [
            'classes' => $classes 
        ]);
    }

   

    /**
     * @Route("/classes/new", name="new_class")
     * @Method({"GET","POST"})
     */
    public function new(Request $request)
    {
        $class = new Classes();

        $form = $this->createFormBuilder($class)
            ->add('Title', TextType::class, array('attr' =>
            array('class' => 'form-control')))
            ->add('save', SubmitType::class,array('label' => 'Create',
            'attr' => array('class' => 'btn btn-primary mt-3')))
            ->getForm();

            $form->handleRequest($request);

            if($form->isSubmitted() && $form->isValid()) {
                $class = $form->getData();

                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($class);
                $entityManager->flush();

                return $this->redirectToRoute('classes_list'); 
            }

            return $this->render('classes/new.html.twig', array(
                'form' => $form->createView()
            ));
  
    }

    /**
     * @Route("/classes/edit/{id}", name="edit_class")
     * @Method({"GET","POST"})
     */
    public function edit(Request $request, $id)
    {
        $class = new Classes();

        $class = $this->getDoctrine()->getRepository(classes::class)->find($id);

        $form = $this->createFormBuilder($class)
            ->add('Title', TextType::class, array('attr' =>
            array('class' => 'form-control')))
            ->add('save', SubmitType::class,array('label' => 'Create',
            'attr' => array('class' => 'btn btn-primary mt-3')))
            ->getForm();

            $form->handleRequest($request);

            if($form->isSubmitted() && $form->isValid()) {
               
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->flush();

                return $this->redirectToRoute('classes_list'); 
            }

            return $this->render('classes/edit.html.twig', array(
                'form' => $form->createView()
            ));
  
    }

     /**
     * @Route("/classes/delete/{id}")
     * @Method({"DELETE"})
     */
    public function delete(Request $request, $id){
        $class = $this->getDoctrine()->getRepository(Classes::class)->find($id);
        
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->remove($class);
        $entityManager->flush();

        $response = new Response();
        $response->send();
    }
  

    /**
     * @Route("/classes/{id}", name="classes_show")
     * @Method({"GET"})
     */
    public function show($id){
        
        $_class = $this->getDoctrine()->getRepository(Classes::class)->find($id);

        
        return $this->render('classes/show.html.twig', array('classes' => $_class));

    }


    // /**
    //  * @Route("custom/classes/save")
    //  */
    //   public function save() {
    //       $entityManager = $this->getDoctrine()->getManager();

    //       $classes = new Classes();
    //       $classes->setTitle('Grade 2');
          

    //       $entityManager->persist($classes);
    //       $entityManager->flush();

    //       return new Response('Saved an classes with the id of '.$classes->getId());
    // }
}

Index.html.twig是我需要找到列表过滤器的位置

{% extends 'base.html.twig' %}

{% block title %}Classes{% endblock %}

{% block body %}
<br>
<h1>Classes:</h1>
<a href="/classes/new" class = "btn btn-success" style = "position:absolute; left:840px; top:85px; height:40px; width:100px"> Create </a>
<br>
{% if classes %}
  <div class="alignleft">  
        <table id="classes" class="table table-striped" style="width:70%">
             <thead>  
                <tr>   
                    <th>Class</th>
                    <th>Details </th>
                    <th>Edit</th>
                    <th>Delete</th>
                 </tr>
             </thead>
               <tbody>
                    {% for classes in classes %}
                        <tr>
                            <td> {{ classes.title }}</td>
                            <td>
                                <a href="/classes/{{ classes.id }}" class = "btn btn-info">Show Class Details</a>
                            </td> 
                            <td>
                                <a href="/classes/edit/{{ classes.id }}" class = "btn btn-primary">Edit</a>
                            </td>
                            <td>
                                <a href="#" class = "btn btn-danger delete-class" data-id="{{ classes.id }}">X</a>
                            </td>
                        </tr> 
                    {% endfor %}
             </tbody>
        </table>
    </div>
    <div>
        <form method="GET" action="search" style = "position:absolute; left:1100px; top:150px; height:100px; width:100px">
            <input type="text" name="q" placeholder="Search Query...">
            <select name="column" style = "position:absolute; left:40px; top:30px; width:100px ">
                <option value="classes.Title" >Class</option>
            </select> 
            <input type="submit" class="btn btn-warning" value="Find" style = "position:absolute; left:40px; top:56px; width:100px "> 
        </form>
    </div>
{% else %}
    <p>No Classes Available</p>
{% endif %}
{% endblock %}


{% block javascripts %}
    <script src="/js/classmain.js"></script>
{% endblock %}

标签: phpsymfonydoctrinequery-builder

解决方案


我不明白您对过滤器的期望行为,但我希望它会对您有所帮助..

  • 在你的 ClassesRepository.php
    // if has not $classTitle and $query it will find all
    public function getSearchClasses($classTitle = null , $query=null){

        $qb = $this->createQueryBuilder('c')
                   ->orderBy('c.Title', 'DESC');

           if($classTitle && $classTitle !== '') {

             $qb->andWhere('c.Title LIKE :classTitle')
                   ->setParameter('classTitle', '%' . classTitle . '%');
           }
           
           if($query && $query !== '') {

            // doSomethings with query input
           }
                  
         return $qb->getQuery()->getResult();

    }
  • 在您的classesController 中:
    /**
     * @Route("custom/classes", name="classes_list")
     */
    public function index(Request $request)
    {
        $classTitle = $request->query->get('classTitle',null);
        $query = $request->query->get('query',null);

        // if has not $classTitle and $query it will find all

        $classes = $this->getDoctrine()->getRepository(classes::class)->getSearchClasses($classTitle,$query);

        return $this->render('classes/index.html.twig', [
            'classes' => $classes 
        ]);
    }


  • 在你的index.html.twig
// redirect to the same route that render this template ..

<form method="GET" action="{{ path('classes_list') }}">
    <input type="text" name="query" placeholder="Search Query...">

    <select name="classTitle">
    {% for class in classes%}
        <option value="{{class.title}" >{{class.title}}</option>
     {% endfor %}
    </select>
    
    <input type="submit" class="btn btn-warning" value="Find">

</form>

推荐阅读