Symfony 4 формируют «многие ко многим», используя таблицу соединений с дополнительными атрибутами - PullRequest
0 голосов
/ 11 января 2020

Кажется, я не могу понять, как объединить формы. Я использовал этот ТАКой вопрос, чтобы попытаться приблизиться, но все, что я получаю, это ошибка нехватки памяти.

При создании Покупателя я хочу добавить Контакты одновременно. Я вижу примеры флажков для этого, но я хочу поля ввода, и контакт может не существовать.

Кроме того, контакты - это общее хранилище для любых контактов, в которые они могут входить в состав различных покупателей / продавцов.

/**
 *
 * @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 ]

0 голосов
/ 16 января 2020

Это была моя ошибка, поскольку сущности были созданы для существующего приложения. Все, что мне нужно было сделать, это настроить однонаправленные отношения ManyToMany между Покупателем и контактами, и все работает как задумано.

0 голосов
/ 11 января 2020

если я правильно понимаю, вам нужно встраивать поля формы:

По сути, вам нужно создать 2 разные формы, а в одну, в которую вы хотите встроить поля, добавить их следующим образом (вы необходимо поместить этот код в класс формы BuyerType):

 $builder->add('field', BuyerContactType::class, [
    // ...
 ]);

Где BuyerContactType::class - это форма, содержащая поля, которые вы хотите встроить. (или наоборот BuyerContactType to BuyerType)

Надеюсь, это поможет, не знаю, правильно ли вы поняли вопрос

...