当前位置: 首页 > 知识库问答 >
问题:

如何根据不相关的关系过滤Symfony表单实体输出

梁丘成和
2023-03-14

我有如下三个实体:
-available-teams(由管理员管理)
-player-preconfig(由管理员管理)
-player-self](由User(Player本身)管理)

在此输入图像说明

可用团队:
-->所有可用团队

player-preconfig:
-->在这里,管理员可以预选允许玩家参加的队伍。(first-filter-many2many:available-teams<->player-preconfig)-视图中有很多复选框。

球员-自我:
-->在这里,球员应该能够选择他想参加的球队(多个)。但他不应该列出所有可能的可用团队,而应该列出剩下的团队。


    /**
     * TeamsPlayerBundle\Entity\Teams
     *
     * @ORM\Table(name="team")
     * @ORM\Entity
     */
    class Team
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

        /**
         * @var string $name
         *
         * @ORM\Column(name="name", type="string", length=255)
         */
        private $name;

        /**
         * @ORM\ManyToMany(targetEntity="PreConfig", mappedBy="teams", cascade={"persist", "remove"})
         **/
        private $configs;

        /**
         * @ORM\ManyToMany(targetEntity="Player", mappedBy="teams2show", cascade={"persist"})
         **/
        private $players;

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

     (... setters and getters) 

    ###################################################

    /**
     * TeamsPlayerBundle\Entity\PreConfig
     *
     * @ORM\Table(name="preconfig")
     * @ORM\Entity
     */
    class PreConfig
    {
        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

        /**
         * @ORM\ManyToMany(targetEntity="Teams", inversedBy="configs", cascade={"persist", "remove"})
         * @ORM\JoinTable(name="preconfig_teams)
         **/
        private $teams;    

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

     (... setters and getters)

     ####################################################

     /**
     * TeamsPlayerBundle\Entity\Player
     *
     *
     * @ORM\Table(name="player")
     * @ORM\Entity
     */
    class Player
    {   
        /**
         * @var integer $player_id
         *
         * @ORM\Column(name="player_id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $player_id;

        /**
         * @var string $name
         * @Assert\NotBlank
         *
         * @ORM\Column(name="name", type="string", length=64)
         */
        private $name

        /**
         * @ORM\ManyToMany(targetEntity="Team", inversedBy="player", cascade={"persist"})
         * @ORM\JoinTable(name="player_team",
         *                      joinColumns={@ORM\JoinColumn(name="player_id", referencedColumnName="id")},
         *                      inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")}
         *     )
         **/
        private $teams2show;    

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


      (... setters and getters)  

 

现在我有这样的FormType:我尝试按照“viktor77”的建议使用Query_Builder解决问题

namespace TeamsPlayerBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Doctrine\ORM\EntityRepository;
use TeamsPlayerBundle\Entity\Player;

class Teams2ShowType extends AbstractType
{ 
    public function buildForm(FormBuilder $builder, array $options)
    {

  $builder
        ->add('teams2show', 'entity', array(
                   'class' => 'TeamsPlayerBundle\Entity\PreConfig',
                        'query_builder' => function(EntityRepository $er) use ($cid) {
                            return $er->createQueryBuilder('c')
                                            ->add('orderBy', 'c.name ASC')
                                            ->innerJoin('c.teams', 'c2')
                                            ->where('c2.id = :configId')
                                            ->setParameter('configId', $cid);

                        },
                    'expanded' => true,
                    'multiple' => true,
                    'property_path' => 'teams2show',
                    'property' => 'name'
                    ))           
    ;

...

供您参考:=>我的第一个表单如下所示:

class Teams2ShowType extends AbstractType
{ 
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('teams2show', 'entity', array(
                       'multiple' => true,
                       'expanded' => true,

问题是这样的:
如果我现在就呈现表单,那么一切正常,但是会呈现一个巨大的复选框列表。整个实体呈现出来。

当然,因为我不知道如何只填充剩余的实体,这取决于可用的manytomany关系--teams<->player-preconfig)。

因为显然我实际的Teams2ShowType不知道只有剩下的团队才应该出现。

我已经尝试了很多,阅读了很多(query_builder、model transformer等),但我不能正确地处理它。

我的真实示例(在公司中)需要处理许可方和合作伙伴配置,但我希望在一个更容易理解的场景中提出这个问题。

我不知道如何实施这项权利的任何最佳做法。

非常感谢你的帮助,我已经尝试解决这个问题超过3-4天。

亲切的问候,

共有1个答案

易星纬
2023-03-14

可以使用query_builder选项。只需使用条令查询生成器API就可以获得在表单中呈现的所需实体,而不是所有实体

 类似资料:
  • 我有如下三个实体: -available-teams(由管理员管理) -player-preconfig(由管理员管理) -player-self](由User(Player本身)管理) 在此输入图像说明 可用团队: -->所有可用团队 player-preconfig: -->在这里,管理员可以预选允许玩家参加的队伍。(first-filter-many2many:available-teams

  • 我试图坚持两个实体,它们有一对一和多对一的关系。 我正在尝试将表单集合嵌入到表单中。 我有一个多对一相关的实体,每次我创建一个新的课程简历,它与Candidat列相关candidat_id_id为空。 除了数据可数据中的Candidat id之外,只有实体Curendar umVitae被成功创建和持久化。 简历表 id|titre|candidat_id_id|id_education cand

  • 我正在试图找出设置实体图的最佳方法。我将基于下面的图像进行解释。 TBLParentCustomer:此表存储主要客户的信息,主要客户可以是企业或消费者。(使用查找表TBLCustomerType标识这些客户。) TBLChildCustomer:此表存储主客户下的客户。主要业务客户可以有授权员工和授权代表,主要消费客户可以有授权用户。(它们是使用查找表TBLCustomerType标识的。) T

  • 此代码崩溃: 原因:组织。postgresql。util。PSQLException:错误:关系“订阅”不存在 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect Springjpa。数据库平台=组织。冬眠地方话PostgreSQL10方言Spring。jpa。冬眠ddl auto=创建拖放

  • 问题内容: 如何在EJB 3.0实体Bean(JPA)中建立单向关系? 例如,客户了解Order,但是Order没有任何针对客户的方法。使用(@OneToMany或@OneToOne或@ManyToMany) 问候 问题答案: 使用JPA 2.0 建立单向关系的方法如下: 关系型数据库: 顾客: 订购:

  • 在@JoinColumn中的一对多关系中,我从子表中设置name,从父表中设置reference column。但是,当我在上面的person类中用@OneToOne定义相同的单向关系时,我必须从person表而不是从name表中设置@JoinColumn名称。 我的问题是为什么这两个连接条件中的定义名称不同,在一个条件中,我必须将该名称设置为来自同一表的PK列名的名称,而在第二个示例中,我必须设