У меня есть отношение manytoone между сущностью подписки и сущностью клиента. Делаю форму для добавления подписки клиенту. В этой форме я могу выбрать уже существующего клиента, но я хотел бы иметь возможность создать нового клиента, если он не существует.
class Customer implements \JsonSerializable
{
/**
* @var int
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type = "integer")
*/
private $id;
/**
* @var string
*
* * @ORM\Column(type = "string", length=180, unique=true)
*/
private $name;
public function getId(): ?int
{
return $this->id;
}
public function setName(string $name): void
{
$this->name = $name;
}
public function getName(): ?string
{
return $this->name;
}
/**
* {@inheritdoc}
*/
public function jsonSerialize(): string
{
return $this->name;
}
public function __toString(): string
{
return $this->name;
}
}
class Subscription
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type = "integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity = "App\Entity\Customer")
* @ORM\JoinColumn(nullable=false)
*/
private $customerName;
public function getId(): ?int
{
return $this->id;
}
/**
* @return CustomerName
*/
public function getCustomerName()
{
return $this->customerName;
}
public function setCustomerName($customerName): self
{
$this->customerName = $customerName;
return $this;
}
public function __toString()
{
return $this->customerName;
}
}
class SubscriptionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('customerName', null, array(
'required' => true,
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => TicketSubscription::class,
'customerName' => null
]);
}
}
Итак, в настоящее время я могу создать подписку для существующего клиента, я хотел бы знать, как я могу создать подписку для несуществующего клиента?




Относится к этому официальному документу для полной реализации: https://symfony.com/doc/current/reference/forms/types/collection.html Вы должны использовать CollectionType, чтобы содержать коллекцию клиента в вашем случае. Затем в своей ветке напишите jquery для динамического добавления нового клиента. Что-то типа:
class SubscriptionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('customers', CollectionType::class, array(
'entry_type' => CustomerType::class,
'entry_options' => [
'allow_add' => true,
'prototype' => true
]
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => TicketSubscription::class,
'customerName' => null
]);
}
}
Меня сбивает с толку то, что у вас есть свойство под названием «customerName», которое является сущностью клиента (а не только именем). почему он так называется? относительно вашей проблемы: не так просто сделать и то, и другое (выбрать, создать) в одной форме. вместо
->add('customerName', null, ...)вы можете->add('customerName', CustomerType::class, ...), а также добавитьCustomerTypeдля указания свойств клиента.