Сбой при отправке формы OneToMany в базу данных (Symfony2 / Doctrine)

1

У меня есть форма, которая загружает файл, и я пытаюсь "прикрепить" к нему правильный идентификатор/объект задания, но, похоже, я не совсем понимаю концепцию табличных отношений:

Мой класс файлов

/**
 * @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");
    }

Отправка формы заканчивается фатальной ошибкой:

Catchable Fatal Error: аргумент 1, переданный в AppBundle\Entity\File :: setJob() должен быть экземпляром AppBundle\Entity\Job, заданной строкой, вызываемой в /var/www/html/web2gdv/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php в строке 410 и определяется

Я пробовал отлаживать то, что было отправлено с помощью

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?

  • 0
    Можем ли мы увидеть вашу полную работу, пожалуйста?
  • 0
    Вот и все, он довольно большой: pastebin.com/hEFykA41
Показать ещё 5 комментариев
Теги:
forms
doctrine

3 ответа

1
Лучший ответ

Попытайтесь четко определить свою полевую job в своей форме:

->add('job','entity',array(
        'class'=>'AppBundle:Job',
        'property'=>'id',
)
  • 0
    ИДЕАЛЬНЫЙ! изменил property на choice_label поскольку оно устарело, но оно работает. Дополнительный вопрос: как мне заполнить несколько форм? Я обновлю свой вопрос!
  • 0
    Полезно знать :) Я прокомментировал ваше обновление
0

Вы добавляете ("задание", "текст") и должны иметь тип сущности, а не текст

Сначала вам нужно иметь "рабочие места" в БД. Затем вы можете перейти на

$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();

вы получите поле выбора в поле задания

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
  • 0
    Хотя это может быть правильным (скорее, findOneBy, я думаю), это не то, что приводит к фатальному исходу, так как он не проходит мимо $form->handleRequest($request);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню