Doctrine orm Symfony 3.1表格,带查找表和多选保存选项(3个表格)

Doctrine orm Symfony 3.1表格,带查找表和多选保存选项(3个表格),doctrine-orm,symfony,symfony-forms,Doctrine Orm,Symfony,Symfony Forms,我的问题与用这些表构建表单有关,因为我一直在使用Symfony 3.1.1创建表单。我有这3个表,即User、User2Pref和Preference,我希望它们的关系是不言自明的。我创建了等效的实体,我也在接下来的部分中介绍了这些实体 ======================== | User | |======================| | id | Fname | Lname | Profile Table | 1 | Tom

我的问题与用这些表构建表单有关,因为我一直在使用Symfony 3.1.1创建表单。我有这3个表,即User、User2Pref和Preference,我希望它们的关系是不言自明的。我创建了等效的实体,我也在接下来的部分中介绍了这些实体

======================== 
|         User         | 
|======================| 
| id | Fname  | Lname  |  Profile Table
| 1  | Tom    | Cat    | 
| 2  | Jerry  | Rat    | 
----------------------- 

======================== 
|       User2Pref      | 
|======================| 
| U.id | P.id |  Tag   |  Mapping Table
|   1  |   2  |   a    |  Tag is optional
|   2  |   3  |   b    | 
------------------------ 

========================
|         Pref         | 
|----------------------| 
|  id |  Prop  |  Grp  |  Properties Table
|  1  |  Wht   |  Col  |  Can be grouped, or have more
|  2  |  Blk   |  Col  |  columns (properties)
|  3  |  Abc   |  Xyz  | 
------------------------ 
用户实体:

class User {
    ....
    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\UserPreferenceMapping", mappedBy="user")
     *
     */
     pritected theMappings;
     ....
}
UserToPref实体:

class UserToPref {
    ....
    /**
     * @var \AppBundle\Entity\Preference
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Preference", inversedBy="theMappings")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="preference_id", referencedColumnName="id")
     * })
     */
     private $preference;

    /**
     * @var \AppBundle\Entity\User
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="theMappings")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
     * })
     */
     private $user;

     ....
 }
优惠实体:

class Property {    
    /**
     *
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\UserPreferenceMapping", mappedBy="preference")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="preference_id", referencedColumnName="id")
     * })
     *
     */
    protected $theMappings;
}
对于formTypes,我创建了:UserType、UserToPrefType和PropertyType类。我能够创建表单,但只是部分创建,因此没有多大帮助。我想从首选项表中取出不同的选项,并能够为[A]保存一个/或多个值。一种新的形式[B]。编辑表单。有人能帮我吗

新增详情:1

======我的窗体和控制器======

这是我的用户类型表单:prototype

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
        ->add('fname')
        ->add('lname')

        ->add('favColours', ChoiceBoxType:class,

        /* I want to show here all choice of colours from Preferences table and let user choose none/one/multi. 
         * What I tried: fetching them from database directly using query builder, I could show options inside choicebox
        */
        )

        ->add('favHobbies', 
        /* similar as above this time hobbies from Preferences table */
        )

        ->add('moreOptions', 
        /* similar as above with more options from Preferences table */
        )

        /* and so on */
}
在添加新控制器时,我从以下内容开始:

public function newAction(Request $request) {

    $pref = new Preference();
    $maps = new User2Pref();

    /* NEED HELP TO INIT USER2PREF AND PREFERENCE OBJECTS FOR USER */

    $form = $this->createForm('AppBundle\Form\UserType', $user);
    $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            /* NEED HELP HERE TO PERSIST SUBMITTED DATA INTO User2Pref */
        }
        ...
    }
    ...
}
类似地,在编辑控制器内部:

public function editAction(Request $request) {

    $pref = new Preference();
    $maps = new User2Pref();

    /* NEED HELP TO LOAD EXISTING VALUES FROM User2Pref AND PREFERENCE */

    $form = $this->createForm('AppBundle\Form\UserType', $user);
    $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            /* NEED HELP HERE TO PERSIST SUBMITTED DATA INTO User2Pref */
        }
        ...
    }
    ...
}
问题是,addNew表单可以显示选项,但我不知道如何在提交时保留它们。同样,也无法加载保存的选项。需要帮助!:o

新增详情2

======开放供选择======

如果实现需求更简单,我可以放弃User2Pref表的想法。以下是以图片形式呈现的想法。绿色是用户的本机表单字段,白色下拉列表是首选项表中的选项,表示它们是固定的/特定的,并且是无/多选的,蓝色:可能是用户可以动态添加的内容


然后,我将了解用户和偏好之间的许多关系。您能给我一些提示,说明如何从控制器内部实现这一目标吗?

有几种方法可以做到这一点。仅举几个例子:

自定义PreferenceCollectionType包含处理首选项的字段,必须使用将整个首选项实体集合转换为按Preference::grp属性或其名称分组的几个较小集合的。以及一个反向转换器,用于将子集合合并为单个集合的操作

通过为每个组创建子类,在用户中为每个组创建单独的多对多字段。这实际上是可以不用的,但您将负责关注数据的内聚性

通过仅在用户类上实现适当的setter和getter来模拟这些单独的首选项集合的存在。那么表单就会认为存在这样的属性

我不会为您提供现成的解决方案,因为我不知道您需要哪种解决方案,而且无论如何,在这里编写它而不在实际代码中运行也不够简单

编辑:
由于您使用的是manyToOne+oneToMany而不是manytoMany,因此使用STI的第二个解决方案可能很难实现。

您能否更详细地解释一下最终表单的外观?现在我不清楚你想做什么。您也可以提供您尝试过的内容,并指出它有什么问题。@dragoste:谢谢您的评论。我现在添加了更多细节。我想为所选用户和首选项对将所选选项保存到User2Pref表中。建议?好吧,我现在明白你的问题了。用户中只有一个首选项集合,但希望按Preference::group将其拆分为几个表单字段。这是正确的吗?没错,我希望能够像我在问题中提到的那样将它们保存到User2Pref表中。你能告诉我怎么做吗我相信专家!我补充了一些细节。我很确定你为我找到了正确的解决方案。