Symfony 4>最好的方式过滤结果列表

时间:2019-08-02 12:50:54

标签: doctrine-orm symfony4

我正在研究一个新的Symfony 4项目。

我有一个 扬声器 的列表和一个 主题 的列表,并且我有一个ManyToMany关系之间。

class Speakers
{
    // ...

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Themes", inversedBy="speakers")
     * @ORM\JoinTable(name="speakers_themes")
     */
    private $themes;

    /**
     * Speakers constructor.
     */
    public function __construct()
    {
        $this->themes = new ArrayCollection();
    }

    /**
     * @return Collection|Themes[]
     */
    public function getThemes(): Collection
    {
        return $this->themes;
    }

    /**
     * @param Themes $theme
     * @return Speakers
     */
    public function addTheme(Themes $theme): self
    {
        if (!$this->themes->contains($theme)) {
            $this->themes[] = $theme;
        }

        return $this;
    }

    /**
     * @param Themes $theme
     * @return Speakers
     */
    public function removeTheme(Themes $theme): self
    {
        if ($this->themes->contains($theme)) {
            $this->themes->removeElement($theme);
        }

        return $this;
    }
}

class Themes
{
    // ...

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Speakers", mappedBy="themes")
     */
    private $speakers;

    /**
     * Themes constructor.
     */
    public function __construct()
    {
        $this->speakers = new ArrayCollection();
    }

    /**
     * @return Collection|Speakers[]
     */
    public function getSpeakers(): Collection
    {
        return $this->speakers;
    }

    /**
     * @param Speakers $speaker
     * @return Themes
     */
    public function addSpeaker(Speakers $speaker): self
    {
        if (!$this->speakers->contains($speaker)) {

            $this->speakers[] = $speaker;
            $speaker->addTheme($this);
        }

        return $this;
    }

    /**
     * @param Speakers $speaker
     * @return Themes
     */
    public function removeSpeaker(Speakers $speaker): self
    {
        if ($this->speakers->contains($speaker)) {

            $this->speakers->removeElement($speaker);
            $speaker->removeTheme($this);
        }

        return $this;
    }

我希望能够根据主题过滤发言人列表。

由于主题列表很短(3个项目),因此我想到了一个选择框,可以选择要过滤的主题。

但是我不知道什么是最好的方法:

  • 构建特定表格以进行过滤?
class SpeakersFilterType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('themes', EntityType::class,
                [
                    'class'    => Themes::class,
                    'multiple' => true,
                    'expanded' => true
                ])
            ->add('save', SubmitType::class,
                [
                    'label' => 'Filter'
                ]);
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            [
                'method'     => Request::METHOD_GET,
//                'data_class' => null,
                'data_class' => Speakers::class,
            ]
        );
    }
}

我试图构建一个表单,如下所示。 在 configureOptions 方法中,我将方法指定为GET,我希望可以传递一些get参数以进行过滤,但它不起作用。

我有一个错误: 该表单的视图数据应该是App \ Entity \ Speakers类的实例,但是是一个(n)数组。您可以通过将“ data_class”选项设置为null或添加一个将a(n)数组转换为App \ Entity \ Speakers实例的视图转换器来避免此错误。

如果我按照建议将选项'data_class'设置为null,则不会出现错误,但是我不确定它是否有效,关于它发送到URL的奇怪参数:

http://127.0.0.1:8000/speakers/?speakers_filter%5Bthemes%5D%5B%5D=2&speakers_filter%5Bsave%5D=&speakers_filter%5B_token%5D=ClBi9xzMrkM72niXNnkbMi1i-3gWMQ2sgfIxY0M1Pi8

有人可以帮忙吗?非常感谢Symfony新手。

0 个答案:

没有答案