EntityType-不能使用query_builder

时间:2019-11-24 11:22:55

标签: symfony symfony4 symfony-forms

我在Symfony中的FormType有问题。我有一个字段,可让我检查一个或多个复选框,这些复选框的值表示来自另一个实体的对象。 (在这种情况下,是假日类型)。

除了我不希望全部显示它们,因此我使用query_builder这样:

->add('typesConges', EntityType::class, [
                'class' => TypeConge::class,
                'choice_label' => 'nom',
                'expanded' => true,
                'multiple' => true,
                'query_builder' => function (TypeCongeRepository $repoTypes) {
                    return $repoTypes->getTypesNotNull();
                }
            ])

但是它引发了这个错误:

  

名称“ Heures supp”包含非法字符。名称应以   带有字母,数字或下划线,并且仅包含字母,数字,   数字,下划线(“ _”),连字符(“-”)和冒号(“:”)。

但是,如果我删除了query_builder,那么我所有的TypeConge(还有“ Heures supp”)。

GestionSoldes.php

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

class GestionSoldes
{

    /**
     * Types de congés
     *
     * @var Collection|TypeConge[]
     */
    private $typesConges;

    /**
     * All types
     *
     * @var boolean
     */
    private $allTypes;

    public function __construct()
    {
        $this->typesConges = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return Collection|TypeConge[]
     */
    public function getTypesConges(): Collection
    {
        return $this->typesConges;
    }

    public function addTypesConge(TypeConge $typesConge): self
    {
        if (!$this->typesConges->contains($typesConge)) {
            $this->typesConges[] = $typesConge;
        }

        return $this;
    }

    public function removeTypesConge(TypeConge $typesConge): self
    {
        if ($this->typesConges->contains($typesConge)) {
            $this->typesConges->removeElement($typesConge);
        }

        return $this;
    }

    public function getAllTypes(): ?bool
    {
        return $this->allTypes;
    }

    public function setAllTypes(bool $allTypes): self
    {
        $this->allTypes = $allTypes;

        return $this;
    }
}

表格:

<?php

namespace App\Form;

use App\Entity\TypeConge;
use App\Entity\GestionSoldes;
use App\Repository\TypeCongeRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

class GestionSoldesType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('typesConges', EntityType::class, [
                'class' => TypeConge::class,
                'choice_label' => 'nom',
                'expanded' => true,
                'multiple' => true,
                'query_builder' => function (TypeCongeRepository $repoTypes) {
                    return $repoTypes->getTypesNotNull();
                }
            ])
            ->add('allTypes', CheckboxType::class, [
                'required' => false,
                'label' => 'Tous les types de congés',
                'label_attr' => [
                    'class' => 'custom-control-label',
                    'for' => 'allTypes'
                ],
                'attr' => [
                    'class' => 'custom-control-input',
                    'id' => 'allTypes'
                ]
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => GestionSoldes::class,
        ]);
    }

}

我的回购功能:

/**
 * Retourne les types de congés qui ont un solde initial différent de null ( pour form EntityType )
 *
 * @return void
 */
public function getTypesNotNull()
{
    return $this->createQueryBuilder('t')
        ->where('t.soldeInitial is not null')
        ->orderBy('t.nom', 'ASC');
}

1 个答案:

答案 0 :(得分:0)

由于删除te query-builer时未显示任何错误,因此问题一定来自查询生成器。

nom中使用属性query-builder的唯一时刻是

->orderBy('t.nom', 'ASC');

问题在这里。 确保您的ORM(或其他方法)可以使用包含空格的字符串。

  

为证实我的观点,请尝试从查询中删除orderBy