在选择类型 Symfony 5 中显示相关实体中的特定字段

Posted

技术标签:

【中文标题】在选择类型 Symfony 5 中显示相关实体中的特定字段【英文标题】:Show specific fields in related entities in choicetype Symfony 5 【发布时间】:2021-11-15 03:30:48 【问题描述】:

我正在生成一个表单,它的字段与许多实体相关,例如,如果 Entity Gerance 的相关列与 NatRec 实体中的列相同,我只能显示实体 NatRec 中的某些字段。下面的代码可以告诉你事情是如何工作的:

实体 Gerance.php

<?php
// Entity Gerance
namespace App\Entity;

use App\Repository\GeranceRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=GeranceRepository::class)
 */
class Gerance

    /**
     * @ORM\Id
     * @ORM\Column(name="CODEGERA")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=30)
     */
    private $LIBEGERA;

    /**
     * @ORM\Column(type="string", length=1)
     */
    private $NUMEGERA;///// related to NatRec

    public function getId(): ?string
    
        return $this->id;
    

    public function getLIBEGERA(): ?string
    
        return $this->LIBEGERA;
    

    public function setLIBEGERA(string $LIBEGERA): self
    
        $this->LIBEGERA = $LIBEGERA;

        return $this;
    

    public function getNUMEGERA(): ?string
    
        return $this->NUMEGERA;
    

    public function setNUMEGERA(?string $NUMEGERA): self
    
        $this->NUMEGERA = $NUMEGERA;

        return $this;
    


实体 NatRec.php

<?php

namespace App\Entity;

use App\Repository\NatRecRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=NatRecRepository::class)
 */
class NatRec

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer", name="CODNATRE")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=150, nullable=true)
     */
    private $LIBNATRE;

    /**
     * @ORM\Column(type="string", length=1)
     */
    private $NUMEGERA;

    /**
     * @ORM\Column(type="string", length=200)
     */
    private $LIBELLE;

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

    public function getLIBNATRE(): ?string
    
        return $this->LIBNATRE;
    

    public function setLIBNATRE(?string $LIBNATRE): self
    
        $this->LIBNATRE = $LIBNATRE;

        return $this;
    

    public function getNUMEGERA(): ?string
    
        return $this->NUMEGERA;
    

    public function setNUMEGERA(?string $NUMEGERA): self
    
        $this->NUMEGERA = $NUMEGERA;

        return $this;
    

    public function getLIBELLE(): ?string
    
        return $this->LIBELLE;
    

    public function setLIBELLE(string $LIBELLE): self
    
        $this->LIBELLE = $LIBELLE;

        return $this;
    

并且选择的字段必须是相关的。 Image of the select fields

Image of the select fields

由于数据库产生的问题,我无法让实体在原则上相互关联,所以我只能比较每个实体的字段。

ReclamationType.php:

<?php

namespace App\Form;

use App\Entity\Gerance;
use App\Entity\NatRec;
use App\Entity\Reclamation;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ReclamationType extends AbstractType

    public function buildForm(FormBuilderInterface $builder, array $options)
    
        $builder
            ->add('nom')
            ->add('adressere')
            ->add('numetelep')
            ->add('numerofax')
            ->add('adresmail')
            ->add('objreclam')
            ->add('numegera', EntityType::class, [
                'class' => Gerance::class,
                'choice_label' => 'LIBEGERA'
            ])
            ->add('codnatre', EntityType::class,[
                'class' => NatRec::class,
                'choice_label' => 'LIBNATRE'
            ])
            ->add('prenom')
            ->add('cin')
            ->add('datesais')
            ->add('codeclie')
            ->add('usersais')
            ->add('codesect')
        ;
    

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


希望有人可以帮助我解决这个问题。

【问题讨论】:

澄清一下,你想要一个“依赖选择字段”吗? (这将是这样的:drupal.org/files/demonstration.gif) @yvesb 是的!我实际上设法使用 ajax 找到了解决方案,javascript 确实让事情变得更容易,谢谢! 【参考方案1】:

所以我碰巧找到了一个解决方案,方法是从我需要的实体的存储库中获取我想要显示的所有数据,并通过获取元素 id 并更改那里的值在 JavaScript 中创建条件,这只是使用 Symfony 的有点困难表单,因为在我检查元素之前我不知道如何获取所选选项的 id。很高兴我能自己回答这个问题。

【讨论】:

以上是关于在选择类型 Symfony 5 中显示相关实体中的特定字段的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5 和 Doctrine,找不到使用 3 个相关实体获取结果的方法

Symfony2 表单 > 实体字段类型 > 查询构建器 > 可能的子选择?

在 symfony 中显示问题的实体

Symfony 表单 - 在 CollectionType 中的子条目类型中访问实体

Symfony:必须管理传递给选择字段的“App\Entity\Classement”类型的实体。也许您忘记将其保留在实体管理器中?

如何向 symfony 2 表单添加一些额外的数据