Symfony 4 表单多对多使用 join table 和额外的属性
Symfony 4 form Many to Many using join table with extra attributes
我似乎无法找出将表单嵌入在一起的方法,我已经使用 SO 问题来尝试接近,但我得到的只是内存不足错误。
关于创建买家我想同时添加联系人。我看到了复选框的示例,但我想要输入字段并且联系人可能不存在。
另外,contacts 是一个通用存储,用于存储他们可能属于不同买家/卖家的任何联系人。
/**
*
* @ORM\Table(name="buyer")
* @ORM\Entity
*/
class Buyer
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=30, nullable=false)
*/
private $name;
/**
* @var string|null
*
* @ORM\Column(name="address", type="string", length=60, nullable=true)
*/
private $address;
/**
* @var string|null
*
* @ORM\Column(name="city", type="string", length=60, nullable=true)
*/
private $city;
/**
* @var string|null
*
* @ORM\Column(name="state", type="string", length=20, nullable=true)
*/
private $state;
/**
* @var int|null
*
* @ORM\Column(name="zip", type="integer", nullable=true)
*/
private $zip;
/**
* @ORM\OneToMany(targetEntity="App\Entity\BuyerContact", mappedBy="buyer")
*/
protected $contacts;
public function __construct()
{
$this->contacts = new ArrayCollection();
}
...
/**
*
* @ORM\Table(name="buyer_contact", indexes={@ORM\Index(name="fk_buyer", columns={"buyer"}), @ORM\Index(name="fk_contact", columns={"contact"})})
* @ORM\Entity
*/
class BuyerContact
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var Buyer
*
* @ORM\ManyToOne(targetEntity="App\Entity\Buyer", inversedBy="contacts")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="buyer", referencedColumnName="id")
* })
*/
private $buyer;
/**
* @var Contact
*
* @ORM\ManyToOne(targetEntity="App\Entity\Contact")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="contact", referencedColumnName="id")
* })
*/
private $contact;
...
/**
*
* @ORM\Table(name="contact")
* @ORM\Entity
*/
class Contact
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string|null
*
* @ORM\Column(name="job_title", type="string", length=30, nullable=true)
*/
private $jobTitle;
/**
* @var string|null
*
* @ORM\Column(name="name", type="string", length=60, nullable=true)
*/
private $name;
/**
* @var string|null
*
* @ORM\Column(name="email", type="string", length=120, nullable=true)
*/
private $email;
class BuyerType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('buyer', TextType::class,[
'required'=>true,
'label'=>'Buyer',
'help'=>'The business name of the buyer'
])
->add('address', TextType::class, [
'required'=>false,
'label'=>'Address 1',
'help'=>'Address line one.'
])
->add('city', TextType::class, [
'required'=>false,
'label'=>'City',
])
->add('state', TextType::class,[
'required'=>false,
'label'=>'State',
])
->add('zip', NumberType::class, [
'required'=>false,
'label'=>'Zip',
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Buyer::class,
]);
}
}
class BuyerContactType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('buyer')
->add('contact')
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => PublisherContact::class,
]);
}
}
如果我理解正确的话,你想要的是嵌入表单域:
基本上,您需要创建 2 种不同的表单,并在您想要嵌入字段的表单中像这样添加它们(您必须将此代码放入 BuyerType 表单 class):
$builder->add('field', BuyerContactType::class, [
// ...
]);
其中 BuyerContactType::class
是包含您要嵌入的字段的表单。 (或反之亦然 BuyerContactType 到 BuyerType)
希望对你有帮助,不知道是否理解正确
这是我的错误,因为实体是为现有应用程序生成的。我所要做的就是配置买方和联系人之间的 ManyToMany 单向关系,一切都按预期进行。
我似乎无法找出将表单嵌入在一起的方法,我已经使用
关于创建买家我想同时添加联系人。我看到了复选框的示例,但我想要输入字段并且联系人可能不存在。
另外,contacts 是一个通用存储,用于存储他们可能属于不同买家/卖家的任何联系人。
/**
*
* @ORM\Table(name="buyer")
* @ORM\Entity
*/
class Buyer
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=30, nullable=false)
*/
private $name;
/**
* @var string|null
*
* @ORM\Column(name="address", type="string", length=60, nullable=true)
*/
private $address;
/**
* @var string|null
*
* @ORM\Column(name="city", type="string", length=60, nullable=true)
*/
private $city;
/**
* @var string|null
*
* @ORM\Column(name="state", type="string", length=20, nullable=true)
*/
private $state;
/**
* @var int|null
*
* @ORM\Column(name="zip", type="integer", nullable=true)
*/
private $zip;
/**
* @ORM\OneToMany(targetEntity="App\Entity\BuyerContact", mappedBy="buyer")
*/
protected $contacts;
public function __construct()
{
$this->contacts = new ArrayCollection();
}
...
/**
*
* @ORM\Table(name="buyer_contact", indexes={@ORM\Index(name="fk_buyer", columns={"buyer"}), @ORM\Index(name="fk_contact", columns={"contact"})})
* @ORM\Entity
*/
class BuyerContact
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var Buyer
*
* @ORM\ManyToOne(targetEntity="App\Entity\Buyer", inversedBy="contacts")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="buyer", referencedColumnName="id")
* })
*/
private $buyer;
/**
* @var Contact
*
* @ORM\ManyToOne(targetEntity="App\Entity\Contact")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="contact", referencedColumnName="id")
* })
*/
private $contact;
...
/**
*
* @ORM\Table(name="contact")
* @ORM\Entity
*/
class Contact
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string|null
*
* @ORM\Column(name="job_title", type="string", length=30, nullable=true)
*/
private $jobTitle;
/**
* @var string|null
*
* @ORM\Column(name="name", type="string", length=60, nullable=true)
*/
private $name;
/**
* @var string|null
*
* @ORM\Column(name="email", type="string", length=120, nullable=true)
*/
private $email;
class BuyerType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('buyer', TextType::class,[
'required'=>true,
'label'=>'Buyer',
'help'=>'The business name of the buyer'
])
->add('address', TextType::class, [
'required'=>false,
'label'=>'Address 1',
'help'=>'Address line one.'
])
->add('city', TextType::class, [
'required'=>false,
'label'=>'City',
])
->add('state', TextType::class,[
'required'=>false,
'label'=>'State',
])
->add('zip', NumberType::class, [
'required'=>false,
'label'=>'Zip',
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Buyer::class,
]);
}
}
class BuyerContactType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('buyer')
->add('contact')
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => PublisherContact::class,
]);
}
}
如果我理解正确的话,你想要的是嵌入表单域:
基本上,您需要创建 2 种不同的表单,并在您想要嵌入字段的表单中像这样添加它们(您必须将此代码放入 BuyerType 表单 class):
$builder->add('field', BuyerContactType::class, [
// ...
]);
其中 BuyerContactType::class
是包含您要嵌入的字段的表单。 (或反之亦然 BuyerContactType 到 BuyerType)
希望对你有帮助,不知道是否理解正确
这是我的错误,因为实体是为现有应用程序生成的。我所要做的就是配置买方和联系人之间的 ManyToMany 单向关系,一切都按预期进行。