多对多保存数据

时间:2017-09-03 09:28:01

标签: symfony many-to-many

我有两个有很多关系的实体

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Esame
 *
 * @ORM\Table(name="esame", indexes={@ORM\Index(name="id_tipologia_esame", columns={"id_tipologia_esame"}), @ORM\Index(name="id_analisi", columns={"id_analisi"})})
 * @ORM\Entity(repositoryClass="AppBundle\Repository\EsameRepository")
 */
class Esame
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;



    /**
     * @var \AppBundle\Entity\Nome_esame
     *
      * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Nome_esame")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_tipologia_esame", referencedColumnName="id")
     * })
     */
    private $idTipologiaEsame;

    /**
      * @var \AppBundle\Entity\Analisi
     *
      * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Analisi")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_analisi", referencedColumnName="id")
     * })
     */
    private $idAnalisi;

  /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\TipologiaCampione", inversedBy="esami")
     */

    private $campioni;

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }







    /**
     * Set idAnalisi
     *
     * @param \AppBundle\Entity\Analisi $idAnalisi
     *
     * @return Esame
     */
    public function setIdAnalisi($idAnalisi)
    {
        $this->idAnalisi = $idAnalisi;

        return $this;
    }

    /**
     * Get idAnalisi
     *
     * @return int
     */
    public function getIdAnalisi()
    {
        return $this->idAnalisi;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->campioni = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add campioni
     *
     * @param \AppBundle\Entity\TipologiaCampione $campioni
     *
     * @return Esame
     */
    public function addCampioni(\AppBundle\Entity\TipologiaCampione $campioni)
    {
        $this->campioni[] = $campioni;

        return $this;
    }

    /**
     * Remove campioni
     *
     * @param \AppBundle\Entity\TipologiaCampione $campioni
     */
    public function removeCampioni(\AppBundle\Entity\TipologiaCampione $campioni)
    {
        $this->campioni->removeElement($campioni);
    }

    /**
     * Get campioni
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getCampioni()
    {
        return $this->campioni;
    }

    /**
     * Set idTipologiaEsame
     *
     * @param \AppBundle\Entity\Nome_esame $idTipologiaEsame
     *
     * @return Esame
     */
    public function setIdTipologiaEsame(\AppBundle\Entity\Nome_esame $idTipologiaEsame = null)
    {
        $this->idTipologiaEsame = $idTipologiaEsame;

        return $this;
    }

    /**
     * Get idTipologiaEsame
     *
     * @return \AppBundle\Entity\Nome_esame
     */
    public function getIdTipologiaEsame()
    {
        return $this->idTipologiaEsame;
    }
}

和实体2

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * TipologiaCampione
 *
 * @ORM\Table(name="tipologia_campione")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\TipologiaCampioneRepository")
 */
class TipologiaCampione
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="tipologia", type="string", length=255, nullable=true)
     */
    private $tipologia;

    /**
     * @var string
     *
     * @ORM\Column(name="matricola", type="string", length=255, nullable=true)
     */
    private $matricola;

  /**
     * @var string
     *
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Esame",mappedBy="campioni")
     */
    private $esami;


    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set tipologia
     *
     * @param string $tipologia
     *
     * @return TipologiaCampione
     */
    public function setTipologia($tipologia)
    {
        $this->tipologia = $tipologia;

        return $this;
    }

    /**
     * Get tipologia
     *
     * @return string
     */
    public function getTipologia()
    {
        return $this->tipologia;
    }

    /**
     * Set matricola
     *
     * @param string $matricola
     *
     * @return TipologiaCampione
     */
    public function setMatricola($matricola)
    {
        $this->matricola = $matricola;

        return $this;
    }

    /**
     * Get matricola
     *
     * @return string
     */
    public function getMatricola()
    {
        return $this->matricola;
    }


    /**
     * Constructor
     */
    public function __construct()
    {
        $this->esami = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add esami
     *
     * @param \AppBundle\Entity\Esame $esami
     *
     * @return TipologiaCampione
     */
    public function addEsami(\AppBundle\Entity\Esame $esami)
    {
        $this->esami[] = $esami;

        return $this;
    }

    /**
     * Remove esami
     *
     * @param \AppBundle\Entity\Esame $esami
     */
    public function removeEsami(\AppBundle\Entity\Esame $esami)
    {
        $this->esami->removeElement($esami);
    }

    /**
     * Get esami
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getEsami()
    {
        return $this->esami;
    }
}

现在我必须保存数据,在我的控制器中写下这个:

 for($i=0;$i<$form->get('numero_campioni')->getData();$i++) {
            $campione=new TipologiaCampione();
            $campione->setMatricola($form['matricola_'.$i]->getData());
            $campione->setTipologia($form['tipologia_'.$i]->getData());
         foreach($form['esame_'.$i]->getData() as $value){
                $tipo_esame = $this->getDoctrine()
            ->getRepository('AppBundle:nome_esame')
            ->find($value->getId());

             $esame=new Esame();
             $esame->setIdAnalisi($analisi);
             $esame->setIdTipologiaEsame($tipo_esame);
             $em->persist($esame);
             $em->flush();

             $campione->addEsami($esame); -> this don't work

         }
         $em->persist($campione);
         $em->flush();
        }

我希望$ campione-&gt; addEsami($ esame);在我的表esame_tipologia_campione中为每个$ campione创建一条新记录,但它不起作用..

我的表格类型:

<?php



  namespace AppBundle\Form;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\Form\FormBuilder;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\DateType;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Symfony\Component\Form\Extension\Core\Type\TextareaType;
    use Symfony\Component\Validator\Constraints\DateTime;
    use AppBundle\Entity\anagrafica;
    use Symfony\Component\Form\Extension\Core\Type\CollectionType;
    use AppBundle\Form\anagraficaType;
    use Symfony\Component\Form\Extension\Core\Type\CurrencyType;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\NumberType;
    use Symfony\Component\Form\Extension\Core\Type\EmailType;
    use AppBundle\Form\EsameType;
    use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
    use Symfony\Component\Form\Extension\Core\Type\ButtonType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;

    class AnalisiType extends AbstractType {

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {

        $province = array(
            'AG' => 'Agrigento',
            'AL' => 'Alessandria',
            'AN' => 'Ancona',

        );

        $builder->add('ruminanti', ChoiceType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'placeholder' => 'Tipologia di modulo',
                    'choices' => array('Ruminanti' => 'Ruminanti', 'Suini' => 'Suini'),
                    'required' => true,
                    'data' => ($options['data']->getTipoModulo() != NULL ? $options['data']->getTipoModulo() : ''),
                    'attr' => array(
                        'placeholder' => 'Provincia',
            )))
                ->add('idLaboratorio', EntityType::class, array(
                    'label' => false,
                    'placeholder' => 'Laboratorio a cui inviare i dati',
                    'class' => 'AppBundle:Laboratorio',
                    'choice_label' => 'nome',
                        // 'data'=>5 
                ))


//                Dati proprietario
                ->add('privato', ChoiceType::class, array(
                    'label' => false,
                    'choices' => array('Privato' => 'Privato', 'Azienda' => 'Azienda'),
                    'data' => 'Privato',
                    'expanded' => true,
                    'multiple' => false,
                    'mapped' => false,
                ))
                ->add('Nome_proprietario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdProprietario() != NULL ? $options['data']->getIdProprietario()->getNome() : ''),
                    'attr' => array(
                        'placeholder' => 'Nome',
                        'novalidate' => 'novalidate'
            )))
                ->add('Cognome_proprietario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdProprietario() != NULL ? $options['data']->getIdProprietario()->getCognome() : ''),
                    'attr' => array(
                        'placeholder' => 'Cognome',
                        'novalidate' => 'novalidate'
            )))
                ->add('Ragione_sociale_proprietario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'required' => false,
                    'data' => ($options['data']->getIdProprietario() != NULL ? $options['data']->getIdProprietario()->getRagioneSociale() : ''),
                    'attr' => array(
                        'placeholder' => 'Ragione Sociale',
                        'novalidate' => 'novalidate'
            )))
                ->add('Via_proprietario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdProprietario() != NULL ? $options['data']->getIdProprietario()->getvia() : ''),
                    'attr' => array(
                        'placeholder' => 'Via'
            )))
                ->add('Comune_proprietario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdProprietario() != NULL ? $options['data']->getIdProprietario()->getComune() : ''),
                    'attr' => array(
                        'placeholder' => 'Comune'
            )))
                ->add('Provincia_proprietario', ChoiceType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdProprietario() != NULL ? $options['data']->getIdProprietario()->getProvincia() : ''),
                    'choices' => $province,
                    'placeholder' => 'Provincia'
                ))
                ->add('Telefono_proprietario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdProprietario() != NULL ? $options['data']->getIdProprietario()->gettel() : NULL),
                    'attr' => array(
                        'placeholder' => 'Telefono'
            )))
                ->add('email_proprietario', EmailType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdProprietario() != NULL ? $options['data']->getIdProprietario()->getemail() : ''),
                    'attr' => array(
                        'placeholder' => 'E-mail'
                    )
                ))
                ->add('Cod_allev_proprietario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdProprietario() != NULL ? $options['data']->getIdProprietario()->getCodiceAllievo() : ''),
                    'attr' => array(
                        'placeholder' => 'Codice Allevamento'
            )))

//                Dati Veterinario
                ->add('Nome_veterinario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdVeterinario() != NULL ? $options['data']->getIdProprietario()->getNome() : ''),
                    'attr' => array(
                        'placeholder' => 'Nome'
            )))
                ->add('Cognome_veterinario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdVeterinario() != NULL ? $options['data']->getIdProprietario()->getCognome() : ''),
                    'attr' => array(
                        'placeholder' => 'Cognome'
            )))
                ->add('Via_veterinario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdVeterinario() != NULL ? $options['data']->getIdVeterinario()->getvia() : ''),
                    'attr' => array(
                        'placeholder' => 'Via'
            )))
                ->add('Comune_veterinario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdVeterinario() != NULL ? $options['data']->getIdVeterinario()->getComune() : ''),
                    'attr' => array(
                        'placeholder' => 'Comune'
            )))
                ->add('Provincia_veterinario', ChoiceType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdVeterinario() != NULL ? $options['data']->getIdVeterinario()->getProvincia() : ''),
                    'choices' => $province,
                    'attr' => array(
                        'placeholder' => 'Provincia'
            )))
                ->add('Telefono_veterinario', TextType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdVeterinario() != NULL ? $options['data']->getIdVeterinario()->getTel() : NULL),
                    'attr' => array(
                        'placeholder' => 'Telefono'
            )))
                ->add('email_veterinario', EmailType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'data' => ($options['data']->getIdVeterinario() != NULL ? $options['data']->getIdVeterinario()->getEmail() : ''),
                    'attr' => array(
                        'placeholder' => 'E-mail'
                    )
                ))
                ->add('trattamenti', TextareaType::class, array(
                    'label' => false,
                    'attr' => array(
                        'placeholder' => 'Trattamenti(inserire ANAMNESI; SINTOMATOLOGIA; TRATTAMENTI)'
                    )
                ))
                ->add('vacinazione', TextareaType::class, array(
                    'label' => false,
                    'attr' => array(
                        'placeholder' => 'Vacinazioni(obbligatorio)'
                    )
                ))
                ->add('numero_campioni', NumberType::class, array(
                    'label' => false,
                    'attr' => array(
                        'placeholder' => 'Numero Totale di campioni'
                    )
        ));
//->add('save', SubmitType::class, array('label' => 'Create Task'));

        $builder->add('idTipologiaEsame', EntityType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'class' => 'AppBundle:Nome_esame',
                    'choice_label' => 'nome',
                    'group_by' => 'idCategoriaEsame.tipo',
                ))
                ->add('Aggiungi', ButtonType::class, array(
                    'attr' => array(
                        'class' => 'btn-primary col-md-2 conferma_esame'),
                ))
                ->add('Rimuovi', ButtonType::class, array(
                    'attr' => array(
                        'class' => 'btn-primary col-md-2 conferma_esame'),
        ));


//       for($i=0;$i<$options['data']->getNumeroCampioni();$i++){
        for ($i = 0; $i < 60; $i++) {
            $builder->add('checkbox_' . $i, CheckboxType::class, array(
                        'label' => false,
                        'required' => false,
                        'mapped' => false,
                        'attr' => array(
                            'class' => 'check_box_table',
//                   'class'=>'col-md-1 col-xs-3 allineare_sinistra',
                        )
                    ))
                    ->add('matricola_' . $i, TextType::class, array(
                        'label' => false,
                        'mapped' => false,
                        'required' => false,
                        'attr' => array(
                            'placeholder' => 'Matricola (FACOLTATIVA)',
//                        'class'=>'col-md-2 col-xs-9 allineare_sinistra',
                )))
                    ->add('tipologia_' . $i, TextType::class, array(
                        'label' => false,
                        'mapped' => false,
                        'required' => false,
                        'attr' => array(
                            'placeholder' => 'Tipologia (FACOLTATIVA)',
//                        'class'=>'col-md-2 col-md-offset-0  col-xs-9 col-xs-offset-3 allineare_sinistra',
                )))
                    ->add('esame_' . $i, EntityType::class, array(
                    'label' => false,
                    'mapped' => false,
                    'class' => 'AppBundle:Nome_esame',
                        'required'=>true,
                        'multiple'=>true,
                    'choice_label' => 'nome',
//                        'disabled' => 'disabled',
                     'attr' => array(
                            'placeholder' => 'Esami',
                            'class' => 'max_width esame_row select_esame',
//                        'class'=>'col-md-12 col-md-offset-0  col-xs-9 col-xs-offset-3 ',
                )
                ))

                    ->add('Stampa', ButtonType::class, array(
                        'disabled' => 'disabled',
                        'attr' => array(
                            'class' => 'btn-primary text-center',
                        )
                    ))
                     ->add('saveAndAdd', SubmitType::class, array('label' => 'Save and Add'))
            ;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Analisi'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix() {
        return 'appbundle_analisi';
    }

}

$ esame entity和$ campione entity正确保存。

有人能跟我说我做错了吗?

1 个答案:

答案 0 :(得分:0)

您需要创建Join Table

之后,您需要选择哪个实体是关联的所有者(就在文档中的多个章节之后)。 例如,如果你想通过“esami”实体添加“campioni”,你应该像这样设置一个setter:

public function addCampioni(\AppBundle\Entity\TipologiaCampione($campioni) {
    $campioni->addEsami($this);
    $this->campioni[] = $campioni;

    return $this;
}

侨!