我目前正在学习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;
我还为上面的每个实体(CategoryType
和JobType
)提供了一个表单。在我的工作类型中,我希望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的对象无法转换为字符串
我猜这与试图保存为对象的值有关?但我不确定如何解决这个问题,或者我是否正确地解决这个问题?
答案 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...',
))