尝试将数据加载到ChoiceType表单中,但它没有保存

时间:2017-02-23 13:16:07

标签: php forms symfony

我目前正在学习Symfony 3.2并且一直关注Symfony网站上的文档。但是我对于与表单有关的事情有一点问题,所以任何指针都会很棒!

我有两个实体:

作业:

class Job
{   
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=100)
     */
    private $job_name;
    /**
     * @ORM\Column(type="integer")
     */
    private $category_id;

和类别:

class Category
{   
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=100)
     */
    private $category_name;

我还为上面的每个实体(CategoryTypeJobType)提供了一个表单。在我的工作类型中,我希望category_id成为其中列出的类别ID的下拉列表。

我按照这里的文档: http://symfony.com/doc/current/reference/forms/types/choice.html 这里有一个评论: Passing data to buildForm() in Symfony 2.8/3.0

在我JobController我使用Doctrine从类别表中获取所有结果:

$em = $this->getDoctrine()->getManager();
$categories = $em->getRepository('AppBundle:Category')->findAll();

我在选项数组中将$ categories传递给了我的表单:

$form = $this->createForm('AppBundle\Form\JobType', $job, array('categories' => $categories));

在我的JobType中:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Job',
        'categories' => null,
    ));
}

在我的构建器上,我将ChoiceType::class添加到我的category_id,并将选项类别添加到选项数组中:

->add('category_id', ChoiceType::class, array(
            'choices' => $options['categories'],
            'choice_label' => 'category_name',
            'choice_value' => 'id',
            'placeholder' => 'Assign job to category...',
 ))

这在我们加载到视图中的方式上运行正常,但是当我单击create(提交表单)时,我收到以下错误:

  

执行' INSERT INTO作业(job_name,category_id)VALUES(?,?)'用params [" test",null,{},null,null]:

     

捕获致命错误:类AppBundle \ Entity \ Category的对象无法转换为字符串

我猜这与试图保存为对象的值有关?但我不确定如何解决这个问题,或者我是否正确地解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以在类别类中实现__toString()方法,但它有点难看。

更好的方法是按照Symfony doc about entities associations

中的说明将您的实体映射到一起
class Job
{   
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=100)
     */
    private $job_name;
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    private $category;

然后在表单中使用 EntityType::class

->add('category', EntityType::class, array(
    'class' => 'AppBundle\Entity\Category',
    'choice_label' => 'category_name',
    'placeholder' => 'Assign job to category...',
))

答案 1 :(得分:1)

这可能只是问题解决的开始,但您必须首先在Job和Category之间建立真正的关系,更新数据库然后查看formType。使用您的代码,您没有使用Symfony和Doctrine及其ORM的真正潜力。

我会坚持第一部分,其余部分将要求你更多地学习Symfony documentation,因为它对于SO来说有点过于宽泛。

为了在您的实体之间建立真正的关系,我们将在作业和类别之间添加关系:

Job.php

use Doctrine\ORM\Mapping as ORM;

class Job
{   
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=100)
     */
    private $job_name;

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="jobs")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    private $category;

Category.php

use Doctrine\Common\Collections\ArrayCollection;

class Category
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=100)
     */
    private $category_name;

    /**
     * @ORM\OneToMany(targetEntity="Job", mappedBy="category")
     */
    private $jobs;

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

然后,在你的表格中,它应该是这样的:

->add('category', EntityType::class, array(
    'class' => 'AcmeBundle\Entity\Category',
    'choice_label' => 'category_name',
    'placeholder' => 'Assign job to category...',
))