автоматически установить идентификатор базы данных в CollectionType - PullRequest
2 голосов
/ 21 апреля 2019

У меня есть две сущности, ParkingType и Exception, между ними есть отношение OneToMany, поскольку у каждого ParkingType может быть несколько исключений.

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

Проблема : в таблице исключений есть столбец с именем type_id, который используется для привязки этого исключения к типу ParkingType, и мне приходится каждый раз заполнять это поле самостоятельно, выбирая из раскрывающегося списка. Я не хочу этого делать, я хочу, чтобы это поле ссылалось на объект, который я только что создал по умолчанию. Мой код: Исключительная сущность:


<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ExceptionRepository")
 */
class Exception
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=200, nullable=true)
     */
    private $nom;

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    private $datedebut;

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    private $datefin;

    /**
     * @ORM\Column(type="time", nullable=true)
     */
    private $tempsdebut;

    /**
     * @ORM\Column(type="time", nullable=true)
     */
    private $tempsfin;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\TypeParking", inversedBy="exceptions")
     * @ORM\JoinColumn(nullable=false)
     */
    private $type;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getNom(): ?string
    {
        return $this->nom;
    }

    public function setNom(?string $nom): self
    {
        $this->nom = $nom;

        return $this;
    }

    public function getDatedebut(): ?\DateTimeInterface
    {
        return $this->datedebut;
    }

    public function setDatedebut(?\DateTimeInterface $datedebut): self
    {
        $this->datedebut = $datedebut;

        return $this;
    }

    public function getDatefin(): ?\DateTimeInterface
    {
        return $this->datefin;
    }

    public function setDatefin(?\DateTimeInterface $datefin): self
    {
        $this->datefin = $datefin;

        return $this;
    }

    public function getTempsdebut(): ?\DateTimeInterface
    {
        return $this->tempsdebut;
    }

    public function setTempsdebut(?\DateTimeInterface $tempsdebut): self
    {
        $this->tempsdebut = $tempsdebut;

        return $this;
    }

    public function getTempsfin(): ?\DateTimeInterface
    {
        return $this->tempsfin;
    }

    public function setTempsfin(?\DateTimeInterface $tempsfin): self
    {
        $this->tempsfin = $tempsfin;

        return $this;
    }

    public function getType(): ?TypeParking
    {
        return $this->type;
    }

    public function setType(?TypeParking $type): self
    {
        $this->type = $type;

        return $this;
    }
}

Тип объекта Parking:

<?php

namespace App\Entity;

/**
 * @ORM\Entity(repositoryClass="App\Repository\TypeParkingRepository")
 */
class TypeParking
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=55)
     */
    private $libelle;

    /**
     * @ORM\Column(type="time", nullable=true)
     */
    private $tempsmax;

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    private $jourdebut;

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    private $jourfin;



    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Exception", mappedBy="type", cascade={"persist"})
     */
    private $exceptions;

    public function __construct()
    {
        $this->exceptions = new ArrayCollection();
    }
    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTempsmax(): ?\DateTimeInterface
    {
        return $this->tempsmax;
    }

    public function setTempsmax(\DateTimeInterface $tempsmax): self
    {
        $this->tempsmax = $tempsmax;

        return $this;
    }

    public function getJourdebut(): ?\DateTimeInterface
    {
        return $this->jourdebut;
    }

    public function setJourdebut(\DateTimeInterface $jourdebut): self
    {
        $this->jourdebut = $jourdebut;

        return $this;
    }

    public function getJourfin(): ?\DateTimeInterface
    {
        return $this->jourfin;
    }

    public function setJourfin(\DateTimeInterface $jourfin): self
    {
        $this->jourfin = $jourfin;

        return $this;
    }



    public function getLibelle(): ?string
    {
        return $this->libelle;
    }

    public function setLibelle(string $libelle): self
    {
        $this->libelle = $libelle;

        return $this;
    }

    /**
     * @return Collection|Exception[]
     */
    public function getExceptions(): Collection
    {
        return $this->exceptions;
    }

    public function removeException(Exception $exception): self
    {
        if ($this->exceptions->contains($exception)) {
            $this->exceptions->removeElement($exception);
            // set the owning side to null (unless already changed)
            if ($exception->getType() === $this) {
                $exception->setType(null);
            }
        }

        return $this;
    }
    public function addException(Exception $exception)
    {
        $this->exceptions->add($exception);
    }

}

Форма парковки:

<?php


class TypeParkingType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('libelle')
            ->add('tempsmax')
            ->add('jourdebut')
            ->add('jourfin')





           ->add('exceptions', CollectionType::class, [
            'label'        => 'Exception',
            'entry_type'   => Exception1Type::class,
            'allow_add'    => true,
            'allow_delete' => true,
            'prototype'    => true,
            'required'     => false,
            'by_reference' => true,
            'delete_empty' => true,
            'attr'         => [
                'class' => 'collection',
            ],
        ])


        ;
                $builder->add('save', SubmitType::class, [
                'label' => 'See my addresses',
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => TypeParking::class,
        ]);
    }
}

Форма исключения:

class ExceptionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder            

        ->add('nom')
        ->add('datedebut')
        ->add('datefin')
        ->add('tempsdebut')
        ->add('tempsfin')
        ->add('type',EntityType::class, [
            'class' => TypeParking::class,
            'choice_label' => 'libelle',
        ])        

 ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Exception::class,
        ]);
    }
}

1 Ответ

1 голос
/ 21 апреля 2019

просто удалите поле из ExceptionType* и в вашем ParkingType измените addException:

public function addException(Exception $exception)
{
    $this->exceptions->add($exception);
    $exception->setType($this); // <-- this is new.
}

update : вам также нужно установить для опции CollectionType by_reference для исключений false, чтобы сумматор действительно вызывался компонентом формы.

это один способ сделать это. другой вариант - сделать это в вашем контроллере и вызывать setType для каждого исключения, которое вы найдете в типе ParkingType ...

*) это предполагает, что вы никогда не редактируете исключение самостоятельно. в противном случае либо условно добавьте поле формы типа парковки для определенных параметров, либо используйте другую форму для исключений (например, с именем ParkingTypeExceptionType), которая не добавляет поле формы для типа парковки.

...