Php Symfony2表单:自动保存相关对象
我有一个用于插入实体类别的表单。此实体还有两个与其相关的其他实体。 一个相关实体是另一个独立实体组。另一个实体本身是自引用的类别,它是表示前提条件的数组集合。到目前为止,很好,我可以使用正确的ORM注释保持主实体的关系 类别的粗略方案Php Symfony2表单:自动保存相关对象,php,forms,symfony,entitymanager,Php,Forms,Symfony,Entitymanager,我有一个用于插入实体类别的表单。此实体还有两个与其相关的其他实体。 一个相关实体是另一个独立实体组。另一个实体本身是自引用的类别,它是表示前提条件的数组集合。到目前为止,很好,我可以使用正确的ORM注释保持主实体的关系 类别的粗略方案 id:int 标题:字符串 组:obj组 前提条件:[类别obj,类别obj,…] 我创建了一个类型类,用于按照文档中的最佳实践创建表单 $form=$this->createForm(新类别类型($em)); 处境 在持久化实体之前,必须对其进行初始化并将
- id:int
- 标题:字符串
- 组:obj组
- 前提条件:[类别obj,类别obj,…]
$form=$this->createForm(新类别类型($em));
处境
在持久化实体之前,必须对其进行初始化并将发布的数据设置为该实体。发布的相关对象不能简单地设置为持久实体,因为它们的数据类型错误。(例如,自引用集合仅作为id为的数组发布,而不是所选项目的数组集合。)
因此,我捕获这些原始数据,并从实体管理器中分别获取相关实体
目标
插入实体应自动填充相关实体,而不通过实体管理器单独获取这些实体
问题:
表单组件的意思是这些相关对象没有发布并完全可用吗?或者我的实现中缺少了什么?
有没有更自动化的方法
在'premissions'属性的form类上,我必须执行mapped=>false
,否则我会收到一个异常,即传递了错误的类型。但在最后,我希望表单通过映射自动匹配所有对象,省略跳过映射,省略从实体管理器中分别获取相关实体
class CategoryType扩展了AbstractType
{
公共功能构造($em)
{
$this->em=$em;
}
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
$qb=$this->em->createQueryBuilder();
$categories=$qb->select('e.id,e.title')
->from('MyvendorCoreBundle:Category','e')
->indexBy('e','e.id')
->订购人('e.title')
->getQuery()
->getResult();
$categories\u choice=数组\u映射(函数($value){
返回$value['title'];
}(类别),;
$builder->add('title')
->添加('group_Id',新的GroupType($this->em))
->添加('前提条件','选择',数组(
“选项”=>$categories\u选项,
“多个”=>true,
“映射”=>false
))
->添加(‘保存’、‘提交’);
}
公共函数配置选项(选项解析器$resolver)
{
$resolver->setDefaults(数组(
“数据\u类”=>“我的供应商\CoreBundle\Entity\Category”
));
}
公共函数getName()
{
返回“类别”;
}
}
控制器方法
公共函数newAction(请求$Request)
{
$em=$this->getDoctrine()->getManager();
$form=$this->createForm(新类别类型($em));
//提交后重新填充表单
$form->handleRequest($request);
//准备一个新的空类别
$category=新类别();
如果($form->isValid()){
/*捕获表单中发布的一些原始数据*/
//已发布前提条件类别ID,以便稍后获取其实体
$PRESSION_category_id=$form->get('premissions')->getData();
//仅在对象中填充组id的已过帐组实体
$group_raw=$form->get('group_Id')->getData();
//通过发布的id获取显式填充的组实体。
$group=$em->find('MyvendorCoreBundle:group',$group_raw->getGroupid());
//用已发布的数据填充预先准备的组
$category->setTitle($form->get('title')->getData());
$category->setGroupId($group);
//添加前提条件
试一试{
对于($i=0;计数($i\U类别\U ID)>$i;$i++){
$PRESSION_category_id=$PRESSION_category_id[$i];
如果(0>=$predition\u category\u id){//检索id必须大于0
抛出new\Exception('检索前提条件id时出错');
}
$predition\u category=$em->find('MyvendorCoreBundle:category',$predition\u category\u id);
if($predition\u category instanceof category){
$category->addpremission($premission\u category);
}否则{
抛出new\Exception('Myvendor\CoreBundle\Entity\Category检索前提条件时出错');
}
}
$em->persist($category);//插入组项及其关系
$em->flush();
回声“持续”;
}捕获(\异常$e){
回显“”。$e->getMessage();
}
}
返回$this->render('MyvendorCoreBundle:fbm:new.html.twig',数组(
'form'=>$form->createView()
));
}
群组类型
class GroupType扩展了AbstractType
{
公共功能构造($em){
$this->em=$em;
}
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
$groups=$this->em->createQuery(“
选择o.groupid,o.descr
来自MyvendorCoreBundle:o组
按o.groupid索引
o.descr命令
”->getResult();
$groups_dropdown=array();
$groups\u下拉列表=
->add('preconditions', 'collection', array(
'entry_type' => 'entity',
'entry_options' => array(
'class' => 'MyVendorCoreBundle:EduStructItem',
'choice_label' => 'title'
),
'allow_add' => true,
'allow_delete' => true
))
->add('preconditions', 'choice', array(
'choices' => $categories_choice,
'multiple' => true,
'mapped' => false
))