我正在使用内置的Symfony3服务创建表单:
1)在AppBundle\Form
中创建新课程,其中AbstractType
扩展{。}}
2)在我的控制器中创建一个表单对象(使用createForm()
)
3)将该对象直接推送到树枝层(createView()
)
在我的实体方向上,我有两个类,已经由ORM映射到数据库。
第一个是User
,第二个是UserAttribute
。 User
与OneToMany注释的UserAttribute
相关。关系看起来像:
class UserAttr
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="userAttr" )
* @ORM\JoinColumn(nullable=false)
*/
private $user;
来自User
方:
class User
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="UserAttr", mappedBy="user")
* @ORM\JoinColumn(nullable=false)
*/
private $userAttr;
当我添加新字段时(使用$builder->add()
),如果它们与User
类属性相关联,则一切正常。但是如果我对UserAttribute
属性做同样的事情 - symfony找不到该属性的get / set方法。我知道 - 我可以通过class User extends UserAttribute
修复它,但可能不是重点。 Symfony必须有另一个解决方案,可能我错过了一些东西。
谢谢你的时间!
// SOLVED | there should be defined an EntityClassType as below:
$builder->add('credit',EntityType::class,array(
'class' => UserAttr::class
));
答案 0 :(得分:0)
您与One-To-Many
实体的UserAttr
关联User
。因此,用户可能有多个信用。
选项1:
考虑到这一点,你必须在UserFormType中使用collection
字段类型,这是一个有点冗长的过程。
$builder->add('userAttr', CollectionType::class, array(
'label' => false,
'allow_add' => true,
'allow_delete' => true,
'entry_type' => UserAttrType::class
));
然后创建另一个FormType:UserAttrType
来代表UserAttr
,您可以将credit
字段作为UserAttr
的属性。
$builder
->add('credit', TextType::class, array(
'label' => 'Credit',
))
这样,表单将相应地加载和提交,当用户表单更新时,信用值也将更新。这是collection docs的链接。这是embed a collection form。
的方法选项2:
但是,如果您想进一步简化,请将mapped = false
(doc)添加到credit
字段。这将忽略当前错误。但是,您必须手动从credit
Object收集Form
值,并将值设置为Submit Handler中的相应UserAttr
对象。
希望它有所帮助!