За последние 24 часа нас посетили 22111 программистов и 1067 роботов. Сейчас ищут 602 программиста ...

Symfony/Doctrine - Как создать поле под связь mappedBy?

Тема в разделе "PHP для профи", создана пользователем Walk, 30 авг 2019.

  1. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Чтобы вопрос был более понятен, расскажу пару слов про то, как симфони позволяет в форме создания одной сущности, сразу отобразить форму и для заполнения другой, связанной сущности.

    Допустим, у нас есть сущность клиент, с полем паспорт. При этом паспорт - это отдельная сущность со своими параметрами.

    Связь на уровне сущности:
    PHP:
    1. /**
    2.      * @ORM\ManyToOne(targetEntity="App\Entity\Passport", inversedBy="client", cascade={"persist", "merge"})
    3.      * @ORM\JoinColumn(nullable=false)
    4.      */
    5.     private $passport;
    И на уровне формы создания клиента это делается легко:
    PHP:
    1. public function buildForm(FormBuilderInterface $builder, array $options)
    2.     {
    3.         $builder
    4.             // ...
    5.             ->add('passport', PassportType::class)
    А теперь к сути вопроса - у клиента также есть имущество (его может быть много), и связано оно так:

    Со стороны клиента:
    PHP:
    1. /**
    2.      * @ORM\OneToMany(targetEntity="App\Entity\Property", mappedBy="client")
    3.      */
    4.     private $property;
    Со стороны имущества:
    PHP:
    1. /**
    2.      * @ORM\ManyToOne(targetEntity="App\Entity\Client", inversedBy="property", cascade={"persist", "merge"})
    3.      * @ORM\JoinColumn(nullable=false)
    4.      */
    5.     private $client;
    Автоматический генератор крудов свойство $property у клиента полностью игнорирует (отчасти это и понятно, ведь при связи mappedBy никакого поля в таблице client не создается), но наверняка в симфони продумали возможность, указать форме, что мы при создании клиента должны сразу создать несколько вариантов его имущества.

    Кто-нибудь знает, как это сделать?