ManyToMany与属性的Symfony3错误

时间:2017-09-11 17:53:07

标签: symfony doctrine-orm many-to-many symfony-3.3

尝试在2个表中创建关系时遇到错误

Llamadas - || - |< - LlamadaDerivada - > | - || - PersonaDerivada

我们正在努力创建一个只有一个带有“LlamadaDerivada”的创建表单。

内部Llamada实体

<dependencies>
    <dependency>
        <groupId>com.sparkjava</groupId>
        <artifactId>spark-core</artifactId>
        <version>2.6.0</version>
    </dependency>

    <dependency>
            <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.12</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.58</version>
    </dependency>

</dependencies>

然后在LlamadaDerivado实体内部,我们有了这个

<?php

namespace xxxxBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

class Llamada {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="llamada_id_seq", allocationSize=1, initialValue=1)
     */
    private $id;

    /**
     * @var string
     * @Assert\Length(
     *      max = 50,
     *      maxMessage = "Your first name cannot be longer than {{ limit }} characters",
     * )
     * @ORM\Column(name="nombre", type="string", length=150, nullable=false)
     */
    private $nombre;
    /**
     *
     * @ORM\OneToMany(targetEntity="LlamadaDerivado", mappedBy="llamada")
     */
    private $derivados;

    function __construct() {
        $this->derivados = new ArrayCollection();
    }

    function getId() {
        return $this->id;
    }

    function getNombre() {
        return $this->nombre;
    }

    function setId($id) {
        $this->id = $id;
    }

    function setNombre($nombre) {
        $this->nombre = $nombre;
    }

    function getDerivados(){
        return $this->derivados;
    }
    function setDerivados($derivados){
        $this->derivados = $derivados;
    }
}

在PersonaDerivado实体内部

<?php

namespace xxxBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * LlamadaDerivado
 *
 * @ORM\Table(name="llamada_derivado")
 * @ORM\Entity
 */
class LlamadaDerivado
{   

    /**
     * @var \AgendaBundle\Entity\Llamada
     *
     * @ORM\ManyToOne(targetEntity="AgendaBundle\Entity\Llamada",inversedBy="derivados",cascade={"persist"})
     * @ORM\Id
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_llamada", referencedColumnName="id")
     * })
     */
    private $llamada;

    /**
     * @var \AgendaBundle\Entity\PersonaDerivado
     *
     * @ORM\ManyToOne(targetEntity="AgendaBundle\Entity\PersonaDerivado",inversedBy="llamadas",cascade={"persist"})
     * @ORM\Id
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_derivado", referencedColumnName="id")
     * })
     */
    private $derivado;


    /**
     * @var DateTime
     *
     * @ORM\Column(name="fecha_derivacion", type="date", nullable=false)
     */
    private $fechaDerivacion;


    function getLlamada(){
        return $this->llamada;
    }

    function getDerivado(){
        return $this->derivado;
    }

    function getFechaDerivacion() {
        return $this->fechaDerivacion;
    }

    function setLlamada( $llamada) {
        $this->llamada = $llamada;
    }

    function setDerivado( $derivado) {
        $this->derivado = $derivado;
    }

    function setFechaDerivacion($fechaDerivacion) {
        $this->fechaDerivacion = $fechaDerivacion;
    }

}

LlamadaType是

<?php

namespace xxxBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * ReunionLugar
 *
 * @ORM\Table(name="persona_derivado")
 * @ORM\Entity
 */
class PersonaDerivado
{   

    public function __construct() {
        $this->llamadas = new ArrayCollection();
    }
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="reunion_lugar_id_seq", allocationSize=1, initialValue=1)
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nombre", type="string", length=150, nullable=false)
     */
    private $nombre;

    /**
     * @ORM\OneToMany(targetEntity="LlamadaDerivado", mappedBy="derivado")
     */
    private $llamadas;

    function getId() {
        return $this->id;
    }

    function getNombre() {
        return $this->nombre;
    }

    function setId($id) {
        $this->id = $id;
    }

    function setNombre($nombre) {
        $this->nombre = $nombre;
    }

    function setLlamadas($llamadas) {
        $this->llamadas = $llamadas;
    }

}

在控制器内部,我们有这个代码

class LlamadaDto extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $disabled = $options['disabled'];


        $builder
                ->add('id', HiddenType::class)
                ->add('nombre', TextType::class, array(
                    'disabled' => $disabled,
                    'attr' => ['maxlength'=>'50']
                ))->add('apellido', TextType::class, array(
                    'disabled' => $disabled,
                    'attr' => ['maxlength'=>'50']
                ))->add('fecha', DateType::class, array(
                    'format' => 'dd/MM/yyyy',
                    'disabled' => $disabled,
                    'widget' => 'single_text',
                    'attr' => ['class' => 'datepicker']
                ))->add('hora', TimeType::class, array(
                    'disabled' => $disabled
                ))->add('motivo', TextareaType::class, array(
                    'disabled' => $disabled,
                    'attr' => ['maxlength'=>'400']
                ))->add('telefonoContacto', TextType::class, array(
                    'disabled' => $disabled,
                    'attr' => ['maxlength'=>'9']
                ))->add('derivados', EntityType::class, array(
                    'class' => 'AgendaBundle:PersonaDerivado',
                    'choice_label' => 'apellidoNombre',
                    'placeholder' => 'Seleccionar un derivado',
                    'multiple' => true,
                ));
    }

    public function configureOptions(OptionsResolver$resolver) {
        $resolver->setDefaults(array('data_class' => Llamada::class));
    }

}

所谓的服务就是这样:

<?php

/**
     * @Route("/Llamada/save",name="saveLlamada")
     */
    public function saveLlamadaAction(Request $request) {
        $llamadaService = $this->get('llamadaService');
        $derivadoService = $this->get('derivadoService');

        $form = $this->createForm(LlamadaDto::class);
        $form->handleRequest($request);

        $editar = TRUE;
        $llamada = $form->getData();

        $derivados = $request->request->get("llamada_dto")["derivados"];


        $derivadosActuales = $derivadoService->getLlamadaDerivados($llamada->getId());

        foreach ($derivados as $key1 => $d) {
            foreach ($derivadosActuales as $key2 => $da) {
                if($da->getDerivado()->getId()==$d){
                    array_splice($derivados, array_search($d, $derivados),1);
                }
            }
        }

        if ($llamadaService->saveLlamada($llamada)) {
            $this->addFlash(
                    'exitoLlamada', 'Datos de llamada guardados exitosamente'
            );

            $derivadoService->saveDerivados($derivados,$llamada);
        } else {
            $this->addFlash(
                    'errorLlamada', 'Disculpe, hubo un error en el registro de la llamada'
            );
        }
        return new RedirectResponse($this->generateUrl('listaLlamadas', array(), UrlGeneratorInterface::RELATIVE_PATH));
    }

这是我们得到的错误:

  

未捕获的PHP异常Doctrine \ ORM \ ORMInvalidArgumentException:“关联字段类型”Doctrine \ Common \ Collections \ Collection | array“的预期值”xxxBundle \ Entity \ Llamada#$ derivados“,得到”xxxBundle \ Entity \ PersonaDerivado“代替。”在project \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ ORMInvalidArgumentException.php第206行

我们用了1个星期。 非常感谢提前

2 个答案:

答案 0 :(得分:0)

看看Llamada实体,$ derivados是LlamadaDerivado的数组集合,在你的LlamadaType中你使它成为AgendaBundle:PersonaDerivado的entityType,这就是你得到这个错误的原因。考虑使用Collection Type来每次添加所有对象LlamadaDerivado以便很好地尊重映射。

答案 1 :(得分:0)

您可以尝试在表单类型中使用CollectionType而不是EntityType,尽管我前面有一段代码可以正常使用EntityType和OneToMany关系的multiple标志