我有2个实体,topic
和post
。 topic
包含主题的名称。 post
包含文本和主题ID。
我想在我的项目中实现一个函数,允许用户创建一个新主题并为他们的主题撰写帖子。
表单应如下所示:
现在我需要帮助构建表单。只使用TopicType给我我想要的结果,只是没有输入字段来写一篇文章。我尝试添加
$builder->add('post', 'entity', array('class' => 'MyTestBundle:Post', 'property' => 'text'));
到我的PostType但是会创建以前帖子的下拉菜单。
如何创建包含2个相关entites的所有输入字段的表单?
编辑:
Topic.orm.yml
My\TestBundle\Entity\Topic:
type: entity
table: topics
id:
id:
type: integer
generator: { strategy: AUTO }
oneToMany:
posts:
targetEntity: Post
mappedBy: topic
fields:
name:
type: string
length: 50
Post.orm.yml
My\TestBundle\Entity\Post:
type: entity
table: posts
id:
id:
type: integer
generator: { strategy: AUTO }
manyToOne:
topic:
targetEntity: Topic
inversedBy: posts
joinColumn:
name: topic_id
referencedColumnName: id
fields:
text:
type: text
datetime:
type: datetime
渲染表单适用于$builder->add('posts', new PostType());
,但是当我提交表单时,我收到此错误:
Warning: spl_object_hash() expects parameter 1 to be object, string given in C:\projects\symtests\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1375
我究竟如何处理表单并将提交的数据保存到我的数据库?
不幸的是我删除了应该将数据保存到数据库的代码,但它看起来像这样,并返回相同的错误。
public function persistAction()
{
$topic= new Topic();
$post = new Post();
$topic->setCreateDate(new \Datetime('now'));
// set all properties for $topic that you can't set in the form
$post->setTopic($thread);
$post->setDatetime(new \Datetime('now'));
// set all properties for $psot that you can't set in the form
$request = $this->getRequest();
$form = $this->createForm(new ThreadType(), $thread);
$form->bind($request);
if($form->isValid())
{
$em = $this->getDoctrine()->getEntityManager();
$em->persist($topic);
$em->persist($post);
$em->flush();
return new Response('success');
}
else
{
throw new \Exception('form invalid');
}
也许我应该试试这个:How to Embed a Collection of Forms
答案 0 :(得分:3)
在 TopicType.php :
中public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('posts', new PostType())
;
}
EDIT1 : text 应该是Topic
类中链接到Post
类的属性的名称。
在 PostType.php :
中public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('text', 'textarea')
;
}
EDIT2 :在您提供映射文件时,在text
中将posts
更改为TopicType.php
;)