Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2表单:自动保存相关对象_Php_Forms_Symfony_Entitymanager - Fatal编程技术网

Php Symfony2表单:自动保存相关对象

Php Symfony2表单:自动保存相关对象,php,forms,symfony,entitymanager,Php,Forms,Symfony,Entitymanager,我有一个用于插入实体类别的表单。此实体还有两个与其相关的其他实体。 一个相关实体是另一个独立实体组。另一个实体本身是自引用的类别,它是表示前提条件的数组集合。到目前为止,很好,我可以使用正确的ORM注释保持主实体的关系 类别的粗略方案 id:int 标题:字符串 组:obj组 前提条件:[类别obj,类别obj,…] 我创建了一个类型类,用于按照文档中的最佳实践创建表单 $form=$this->createForm(新类别类型($em)); 处境 在持久化实体之前,必须对其进行初始化并将

我有一个用于插入实体类别的表单。此实体还有两个与其相关的其他实体。 一个相关实体是另一个独立实体。另一个实体本身是自引用的类别,它是表示前提条件的数组集合。到目前为止,很好,我可以使用正确的ORM注释保持主实体的关系

类别的粗略方案

  • 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
    ))