带有多对多映射的 Symfony 表单
Symfony Form with ManyToMany Mapping
Symfony 3.4 学说 1.9
我找到了很多关于这个的文章。但没有什么能解决我的
问题。
我有两个实体 User
和 Company
,它们被映射为 Many2Many。
两个实体都应填写表格提交。因此,我有以下 FormTypes:
CustomerRegistrationType
这包括 CollectionType
和 entry_type 的 CompanyFormType
,其中 returns Company:class
class CustomerRegistrationType extends AbstractType
{
private $translator;
private $session;
public function __construct(TranslatorInterface $translator,Session $session)
{
$this->session = $session;
$this->translator = $translator;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('mandant',HiddenType::class,array('data'=>
->add('newsletter',CheckboxType::class,array('label' => false,'required' => false))
->add('company', CollectionType::class, array('entry_type' => CompanyFormType::class, 'entry_options' => array('label' => false)));
}
公司表格类型
class CompanyFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder->add('telephone', TextType::class,array('required' => false))
->add('company_name', TextType::class,array('label' => false,'required' => false))
->add('company_supplement', TextType::class,array('label' =>
->add('send_info', CheckboxType::class,array('label' => false,'required' => false))
->add('send_invoice', CheckboxType::class,array('label' => false,'required' => false))
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Company'));
}
}
多对多映射
class User extends BaseUser
{
public function __construct()
{
parent::__construct();
$this->company = new ArrayCollection();
}
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Company",inversedBy="users")
* @ORM\JoinTable(name="user_comp_comp_user",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="company_id", referencedColumnName="id")}
* )
*/
protected $company;
public function getCompany()
{
return $this->company;
}
public function setCompany($company)
{
$this->company = $company;
return $this;
}
public function addCompany(Company $company)
{
if ($this->company->contains($company)) {
return;
}
$this->company[] = $company;
return $this;
}
public function removeCompany(Company $company)
{
if (!$this->company->contains($company)) {
return;
}
$this->company->removeElement($company);
return $this;
}
class Company
{
public function __construct()
{
$this->users = new ArrayCollection();
}
/**
* @var \Doctrine\Common\Collections\Collection|Company[]
* @ORM\ManyToMany(targetEntity="User",mappedBy="company")
*/
protected $users;
}
在控制器中,我想将所有数据保存到不同的实体中。
为此我这样做:
public function registerAction(Request $request)
{
$user = $this->userManager->createUser();
$form = $this->createForm(CustomerRegistrationType::class,$user);
$form->handleRequest($request);
$company = $user->getCompany();
$company->setSendInvoice(true);
$company->setSendInfo(true);
if ($form->isSubmitted()){
$user->addCompany($company);
$this->userManager->updateUser($user);
....
}
return $this->render('Registration/register.html.twig',[
'form' => $form->createView()
]);
}
不管我怎么试,每次都报错。在此示例中,公司数据为空。其他方式与User()
中$this->company
的ArrayCollection()
冲突
User {#907 ▼
#id: null
#company: ArrayCollection {#926 ▼
-elements: []
}
#groups: null
#mandant: null
#salutation: null
#first_name: null
#last_name: null
#fullname: null
#created: DateTime @1544539763 {#901 ▶}
#telephone: null
更新:
在 Twig 形式中,我无法访问
{{ form_widget(form.company.company_name, {'attr': {'class': 'form-control'}})}}
既不是 属性 "company_name" 也不是 "company_name()"、"getcompany_name()"/"iscompany_name()"/"hascompany_name()" 或“__call()" 在 class "Symfony\Component\Form\FormView".
中存在并具有 public 访问权限
这在表单提交之前出现。
我在这里找到了解决方案:
https://groups.google.com/forum/#!topic/symfony2/DjwwzOfUIuQ
所以我在控制器中使用了基于数组的形式
$form = $this->createFormBuilder()
->add('user', CustomerRegistrationType::class, array(
'data_class' => 'AppBundle\Entity\User'
))
->add('company', CompanyFormType::class, array(
'data_class' => 'AppBundle\Entity\Company'
))
->getForm();
不同的对象可以这样捕捉:
$form->handleRequest($request);
$user = $form->get('user')->getData();
$company = $form->get('company')->getData();
然后
if ($form->isSubmitted()){
...
$user->addCompany($company);
$this->userManager->updateUser($user);
}
就是这样
Symfony 3.4 学说 1.9
我找到了很多关于这个的文章。但没有什么能解决我的 问题。
我有两个实体 User
和 Company
,它们被映射为 Many2Many。
两个实体都应填写表格提交。因此,我有以下 FormTypes:
CustomerRegistrationType
这包括 CollectionType
和 entry_type 的 CompanyFormType
,其中 returns Company:class
class CustomerRegistrationType extends AbstractType
{
private $translator;
private $session;
public function __construct(TranslatorInterface $translator,Session $session)
{
$this->session = $session;
$this->translator = $translator;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('mandant',HiddenType::class,array('data'=>
->add('newsletter',CheckboxType::class,array('label' => false,'required' => false))
->add('company', CollectionType::class, array('entry_type' => CompanyFormType::class, 'entry_options' => array('label' => false)));
}
公司表格类型
class CompanyFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder->add('telephone', TextType::class,array('required' => false))
->add('company_name', TextType::class,array('label' => false,'required' => false))
->add('company_supplement', TextType::class,array('label' =>
->add('send_info', CheckboxType::class,array('label' => false,'required' => false))
->add('send_invoice', CheckboxType::class,array('label' => false,'required' => false))
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Company'));
}
}
多对多映射
class User extends BaseUser
{
public function __construct()
{
parent::__construct();
$this->company = new ArrayCollection();
}
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Company",inversedBy="users")
* @ORM\JoinTable(name="user_comp_comp_user",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="company_id", referencedColumnName="id")}
* )
*/
protected $company;
public function getCompany()
{
return $this->company;
}
public function setCompany($company)
{
$this->company = $company;
return $this;
}
public function addCompany(Company $company)
{
if ($this->company->contains($company)) {
return;
}
$this->company[] = $company;
return $this;
}
public function removeCompany(Company $company)
{
if (!$this->company->contains($company)) {
return;
}
$this->company->removeElement($company);
return $this;
}
class Company
{
public function __construct()
{
$this->users = new ArrayCollection();
}
/**
* @var \Doctrine\Common\Collections\Collection|Company[]
* @ORM\ManyToMany(targetEntity="User",mappedBy="company")
*/
protected $users;
}
在控制器中,我想将所有数据保存到不同的实体中。 为此我这样做:
public function registerAction(Request $request)
{
$user = $this->userManager->createUser();
$form = $this->createForm(CustomerRegistrationType::class,$user);
$form->handleRequest($request);
$company = $user->getCompany();
$company->setSendInvoice(true);
$company->setSendInfo(true);
if ($form->isSubmitted()){
$user->addCompany($company);
$this->userManager->updateUser($user);
....
}
return $this->render('Registration/register.html.twig',[
'form' => $form->createView()
]);
}
不管我怎么试,每次都报错。在此示例中,公司数据为空。其他方式与User()
$this->company
的ArrayCollection()
冲突
User {#907 ▼
#id: null
#company: ArrayCollection {#926 ▼
-elements: []
}
#groups: null
#mandant: null
#salutation: null
#first_name: null
#last_name: null
#fullname: null
#created: DateTime @1544539763 {#901 ▶}
#telephone: null
更新: 在 Twig 形式中,我无法访问
{{ form_widget(form.company.company_name, {'attr': {'class': 'form-control'}})}}
既不是 属性 "company_name" 也不是 "company_name()"、"getcompany_name()"/"iscompany_name()"/"hascompany_name()" 或“__call()" 在 class "Symfony\Component\Form\FormView".
中存在并具有 public 访问权限这在表单提交之前出现。
我在这里找到了解决方案: https://groups.google.com/forum/#!topic/symfony2/DjwwzOfUIuQ
所以我在控制器中使用了基于数组的形式
$form = $this->createFormBuilder()
->add('user', CustomerRegistrationType::class, array(
'data_class' => 'AppBundle\Entity\User'
))
->add('company', CompanyFormType::class, array(
'data_class' => 'AppBundle\Entity\Company'
))
->getForm();
不同的对象可以这样捕捉:
$form->handleRequest($request);
$user = $form->get('user')->getData();
$company = $form->get('company')->getData();
然后
if ($form->isSubmitted()){
...
$user->addCompany($company);
$this->userManager->updateUser($user);
}
就是这样