提问者:小点点

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


我有如下三个实体:
-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个答案

匿名用户

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