Symfony 4 отношение manytoone позволяет добавлять в конструктор форм

У меня есть отношение 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
        ]);
    }
}

Итак, в настоящее время я могу создать подписку для существующего клиента, я хотел бы знать, как я могу создать подписку для несуществующего клиента?

Меня сбивает с толку то, что у вас есть свойство под названием «customerName», которое является сущностью клиента (а не только именем). почему он так называется? относительно вашей проблемы: не так просто сделать и то, и другое (выбрать, создать) в одной форме. вместо ->add('customerName', null, ...) вы можете ->add('customerName', CustomerType::class, ...), а также добавить CustomerType для указания свойств клиента.

Jakumi 04.07.2019 10:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Относится к этому официальному документу для полной реализации: 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
        ]);
    }
}

Другие вопросы по теме