将OneToMany发送到数据库的表单失败(Symfony2 / Doctrine)

时间:2015-11-16 15:38:19

标签: php forms symfony doctrine

我有一个上传文件的表单,我正在尝试“附加”正确的作业ID /实体,但似乎我并不完全理解表关系的概念:

我的文件类

/**
 * @ORM\ManyToOne(targetEntity="Job", inversedBy="file")
 */
protected $job;

我的工作班:

/**
 * @ORM\OneToMany(targetEntity="File", mappedBy="job")
 */
protected $file;

public function __construct()
{
    $this->file = new ArrayCollection();
}

我正在提交表单并将所有内容输入数据库:

$em = $this->getDoctrine()->getManager();
    $file = new File();
    $form = $this->createFormBuilder($file)
        ->add('file')
        ->add('job','text')
        ->add('save', 'submit', array('label' => 'Create Task'))
        ->getForm();

    $form->handleRequest($request);

    if ($form->isValid()) {


        $job = $em->getRepository("AppBundle:Job")->find($form->getData()->getJob());

        $file->setFile($form->getData()->getFile());
        $file->setPath($form->getData()->getPath());
        $file->setJob($job);

        $em->persist($file);
        $em->flush();

        return $this->redirectToRoute("pendingJobs");
    }

提交表单以致命错误结束:

  

捕获致命错误:传递给AppBundle \ Entity \ File :: setJob()的参数1必须是AppBundle \ Entity \ Job的实例,给定字符串,在/ var / www / html / web2gdv / vendor / symfony /中调用第410行的symfony / src / Symfony / Component / PropertyAccess / PropertyAccessor.php已定义

我尝试用

调试发送的内容
if ($form->isValid()) {

        dump($form->getData());
        die();
}

但它甚至可以达到目的?!

我做错了什么?

任何暗示都赞赏!

更新

感谢@ julien-bourdic我更新了我的表格:

 /**
 * @Route("/job/pending", name="pendingJobs")
 */
public function jobAction(Request $request)
{
    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!');

    $em = $this->getDoctrine()->getManager();
    $file = new File();
    $form = $this->createFormBuilder($file)
        ->add('file')
        ->add('job','entity',array(
            'class' => 'AppBundle:Job',
            'choice_label' => 'id',
        ))
        ->add('save', 'submit', array('label' => 'Create Task'))
        ->getForm();

    $form->handleRequest($request);

    if ($form->isValid()) {

        $job = $em->getRepository("AppBundle:Job")->find($form->getData()->getJob());

        $file->setFile($form->getData()->getFile());
        $file->setPath($form->getData()->getPath());
        $file->setJob($job);

        $em->persist($file);
        $em->flush();

        return $this->redirectToRoute("pendingJobs");
    }



    $jobs = $em->getRepository("AppBundle:Job")->findBy(array(
        'receipt' => true,
        'receiptStatus' => true,
    ));

    return $this->render(
        'default/pending.html.twig',
        array(
            'jobs' => $jobs,
            'form' => $form->createView(),
        )
    );


}

这个类的目的是建立一个表,其中每一行的最后一个按钮是一个上传表单。如何从一个类填充多个表单,甚至可能?您必须发送给render函数的内容是什么?

3 个答案:

答案 0 :(得分:1)

尝试在表单中明确定义字段job

->add('job','entity',array(
        'class'=>'AppBundle:Job',
        'property'=>'id',
)

答案 1 :(得分:0)

问题是find()返回数组,而不是Job。使用findOne()

$job = $em->getRepository("AppBundle:Job")->find($form->getData()->getJob());
// $job is and Array

改为

$job = $em->getRepository("AppBundle:Job")->findOne($form->getData()->getJob());
// $job is Job

答案 2 :(得分:0)

您有添加('作业','文字'),且必须有entity类型,而不是文字

首先,您需要在数据库中拥有“作业”。然后你可以改为

$form = $this->createFormBuilder($file)
    ->add('file')
    ->add('job','entity', array('class' => 'YourBundle:Job'))
    ->add('save', 'submit', array('label' => 'Create Task'))
    ->getForm();

或短

$form = $this->createFormBuilder($file)
    ->add('file')
    ->add('job')
    ->add('save', 'submit', array('label' => 'Create Task'))
     ->getForm();

您将在工作栏上收到选择框