Php Symfony 2使用从第一个实体生成的ID从表单中分配2个实体

Php Symfony 2使用从第一个实体生成的ID从表单中分配2个实体,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我有一个表单,从两个相关实体“作业”和“范围”收集数据。作业数据已成功添加到数据库,但我无法获取要添加的范围实体,该实体还需要从作业条目创建的唯一ID。顺便说一句,我用的是教义 以下是jobsType: class jobsType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder

我有一个表单,从两个相关实体“作业”和“范围”收集数据。作业数据已成功添加到数据库,但我无法获取要添加的范围实体,该实体还需要从作业条目创建的唯一ID。顺便说一句,我用的是教义

以下是jobsType:

class jobsType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('jobNumber', null,  array('label' => 'Job Number','attr' => array('placeholder'=>'Code used for job')))

        ->add('description', null,  array('label' => 'Job Description',))

        ;

        $builder->add('scopes', new scopeType())
        ;

    }
    public function getName()
    {
        return 'jobs';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
                'data_class' => 'Baker\TimeSlipBundle\Entity\Jobs',
        ));
    }

}
这是scopeType

    class scopeType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder

        ->add('description', 'entity', array('label' => 'Scope', 'required' => false,
                'class' => 'BakerTimeSlipBundle:Scope',
                'query_builder' => function(EntityRepository $er){
                    return $er->createQueryBuilder('s')
                    ->orderBy('s.description', 'asc');
                },
                'property' => 'description',
                'multiple' => false,
                'expanded' => false,
                'empty_value' => false,
                'attr' => array('class' => 'form-inline'),
                'label_attr' => array('class' => 'required')
        ))

        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
                'data_class' => 'Baker\TimeSlipBundle\Entity\Scope',
        ));
    }

    public function getName()
    {
        return 'scope';
    }
}
这是我的控制器,我想这里的问题是我没有将scope()实例传递给表单生成器。我不知道该怎么做。实体已正确映射

class JobsController extends Controller
{

    public function indexAction($limit, Request $request)
    {

        $jobs= new Jobs();
        $scope = new Scope();   

        $fname=$limit;
        $form = $this->createForm(new JobsType(),$jobs, array(
                'method' => 'POST',
        ));
        $form->handleRequest($request);

        if ($form->isValid()) {

            $em = $this->getDoctrine()->getManager();
                        $em->persist($jobs);
                        $em->persist($scope);
            $em->flush();

            return $this->redirectToRoute('company',array ('limit' =>'Job Submitted Successfully'));
        }


        return $this->render(
                'BakerTimeSlipBundle:Jobs:index.html.twig',
                array('fname' => $fname,
                        'form' => $form->createView()

                )
        );

        }
    }
}
这里的任何帮助都将不胜感激。下面列出了我尝试进入作用域时的错误消息:

使用参数[null,null,null]执行“插入范围(说明,作业SID,作业SID)值(?,?)”时发生异常: SQLSTATE[42000]:语法错误或访问冲突:1110列“jobsId”指定了两次


这里的问题是链接到表单的$jobs对象与$scope对象没有关系。所以,当您试图持久化$jobs时,条令不知道它必须持久化$scope

试试这个:

$jobs= new Jobs();
$scope = new Scope();
$jobs->setScope($scope);
然后,在您的Jobs实体中,在$scopes上方的注释上,确保您有
cascade={“persist”}
(但是您必须已经有了它,因为条令试图持久化,这就是抛出错误的地方),并且您应该准备好了


希望这有帮助

当然没有关系,但是如果($request->isMethod('POST')){},您应该让表单只处理请求。另外,您应该通过执行
$jobs=$form->getData()来检索
$jobs
。谢谢你的建议,我想让条令来处理依赖关系,你必须使用$this->getdoctor()->getManager();嗯,我没有任何设置范围的方法。应该在哪里创建?您的作业实体应该具有scope属性的标准getter和setter。如果没有,请添加它们。更一般地说,检查每个实体的每个属性都有其getter和setter。谢谢,这似乎是正确的答案。虽然当我尝试持久化作用域时,它不会向它传递任何值。尽管乔布斯现在正确地增加了工资。我的scopeType表单类可能有问题。我已经编辑了原始问题,以便现在可以使用。您能确保您的查询返回您期望的值吗?您可以通过转储结果或使用以下命令来完成此操作:
app/console原则:query:dql[您的dql查询]
您是在谈论scopeType()中的查询吗?即检索所有正确的信息。下面是探查器中请求接收的内容。我注意到没有范围键,只有参数为
[jobNumber=>344,范围=>[description=>1],description=>From-Web,clients=>3,company=>2,_-token=>3WjRHBY8VIroYSc2ldf6\u-lptq1hsi00crtbcyar9sa]的jobs键。