Doctrine orm Symfony 3.1表格,带查找表和多选保存选项(3个表格)
我的问题与用这些表构建表单有关,因为我一直在使用Symfony 3.1.1创建表单。我有这3个表,即User、User2Pref和Preference,我希望它们的关系是不言自明的。我创建了等效的实体,我也在接下来的部分中介绍了这些实体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
========================
| 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表中。你能告诉我怎么做吗我相信专家!我补充了一些细节。我很确定你为我找到了正确的解决方案。