ZendFramework2 + ObjectSelect + Doctrine ORM не сохраняет правильную сущность - PullRequest
0 голосов
/ 03 апреля 2019

Я хотел бы использовать ObjectSelect для сохранения данных, связанных с событием (Manifestazione), в таблице, которая связывает Manifestazione и TipoEvento (например, Manifestazione "Football Match" - это TipoEvento "Soccer" и "Sport").

Демонстрация: https://i.imgur.com/TxFZUvE.jpg

Manifestazione:
+==================+===============+
| manifestazioneid |     title     |
+==================+===============+
|               12 | Footbal Match |
+------------------+---------------+

Tipologia:
+==============+==============+==================+
| tipologia_id | tipoeventoid | manifestazioneid |
+==============+==============+==================+
|          182 |            3 |               12 |
+--------------+--------------+------------------+
|          183 |            4 |               12 |
+--------------+--------------+------------------+

TipoEvento:
+===============+=============+
| tipoevento_id | descrizione |
+===============+=============+
|             3 | Soccer      |
+---------------+-------------+
|             4 | Sport       |
+---------------+-------------+

Параметры ObjectSelect отображаются, но без выбранных значений, и каждый раз, когда я сохраняю форму, я получаю NULL tipoeventoid следующим образом:

+==============+==============+==================+
| tipologia_id | tipoeventoid | manifestazioneid |
+==============+==============+==================+
|          201 | NULL         |               12 |
+--------------+--------------+------------------+
|          202 | NULL         |               12 |
+--------------+--------------+------------------+

Что может вызвать эту проблему?Спасибо!

Manifestazione

/**
 * Manifestazione
 *
 * @ORM\Table(name="manifestazione")
 * @ORM\Entity(repositoryClass="Manifestazione\Entity\Repository\ManifestazioneRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Manifestazione {

    /**     
     * @var ArrayCollection @ORM\OneToMany(targetEntity="Manifestazione\Entity\Tipologia", mappedBy="manifestazioneid", orphanRemoval=true, cascade={"persist"})
     *      @Annotation\Exclude()
     */
    protected $tipologie;


    /**
     * This function adds tipologie at the collection.
     *
     * @param Collection $tipologie
     */
    public function addTipologie(Collection $tipologie)
    {
        foreach ($tipologie as $tipologia) {
            $tipologia->setManifestazioneid($this);
            $this->tipologie->add($tipologia);
        }
    }

Типология

/**
 * @ORM\Entity
 * @ORM\Entity @ORM\Table(name="tipologia")
 */
class Tipologia
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer", name="tipologia_id")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $tipologiaid;

    /**
     * @ORM\ManyToOne(targetEntity="Manifestazione\Entity\Tipoevento")
     * @ORM\JoinColumn(name="tipoeventoid", referencedColumnName="tipoevento_id")
     */
    protected $tipoeventoid;

    /**
     * @ORM\ManyToOne(targetEntity="Manifestazione\Entity\Manifestazione", inversedBy="tipologie")
     * @ORM\JoinColumn(name="manifestazioneid", referencedColumnName="manifestazioneid")
     *
     * @var int
     */
    protected $manifestazioneid;

    /**
     *
     * @param field_type $tipoeventoid            
     */
    public function setTipoeventoid($tipoeventoid)
    {
        $this->tipoeventoid = $tipoeventoid;
    }

    /**
     *
     * @param number $manifestazioneid            
     */
    public function setManifestazioneid($manifestazioneid)
    {
        $this->manifestazioneid = $manifestazioneid;
    }

TipoEvento

/**
 * @ORM\Entity @ORM\Table(name="tipoevento")
 */
class Tipoevento
{

    /**
     *
     * @var integer 
     * @ORM\Column(name="tipoevento_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $tipoeventoid;

    /**
     *
     * @var string 
     * @ORM\Column(name="descrizione", type="string", length=255, nullable=false)
     * @Annotation\Type("Zend\Form\Element\Text")
     * @Annotation\Options({"label":"Descrizione:"})
     * @Annotation\Attributes({"class":"form-control"})
     */
    protected $descrizione;

    public function setTipoeventoid($tipoeventoid)
    {
        $this->tipoeventoid = $tipoeventoid;
        return $this;
    }

Контроллер:

        $x = new Fieldset("Tipologia");
        $x->setHydrator(
            new DoctrineObject($em, 'Manifestazione\Entity\Tipologia', true)
            )->setObject(
                new \Manifestazione\Entity\Tipologia()
            );

        $form->add(
            [
                'type' => 'DoctrineModule\Form\Element\ObjectSelect',
                'name' => 'tipologie',
                'required' => false,
                'options' => [
                    'allow_add' => true,
                    'allow_remove' => true,
                    'object_manager' => $em,
                    'target_class'   => 'Manifestazione\Entity\Tipoevento',
                    'property'       => 'descrizione',
                    'label' => 'Tipo evento',
                    'empty_option' => ':: NONE ::',
                    'display_empty_item' => true,
                    'disable_inarray_validator' => true,
                    'target_element' => $x
                ],
                'attributes' => [
                    'id'        => 'tipologie',
                    'class'     => 'form-control',
                    'multiple' => true
                ]
            ]
            );```
...