0

您好,我正在使用 Symfony2,我有以下关系:

表医:

/**
* @ORM\OneToMany(targetEntity="Cita", mappedBy="medico")
*/
protected $citas;

表 citas:

 /**
 * @ORM\ManyToOne(targetEntity="Medico", inversedBy="citas")
 */
 protected $medico;

然后我有这个代码,其中一个预约是创建一个医生。

  $em = $this->get('doctrine')->getEntityManager();
        $cita = new Cita();
        $empleado = $this->get('security.context')->getToken()->getUser();
        $cita->setEmpleado($empleado);
        $cliente = $this->getDoctrine()->getRepository('miomioBundle:Usuario')->find($this->getRequest()->query->get('cliente'));
        $cita->setFechacita(new \DateTime($this->getRequest()->query->get('fecha')));
        $cita->setCliente($cliente);//asociacion de cita a usuario.
        $cita->setFechaoper(new \DateTime('now'));
        $medico = $this->getDoctrine()->getRepository('miomioBundle:Medico')->find($this->getRequest()->query->get('medico'));
        $cita->setMedico($medico);

        $em->persist($cita);
        $em->persist($cliente);
        $em->persist($empleado);
        $em->flush();

然后尝试预约医生:

public function pintarAction($id)
    {
        $return_arr = array();
        $medico = $this->getDoctrine()->getRepository('miomioBundle:Medico')->find($id);
        $citas = $medico->getCitas();
        foreach($citas as $cita){
                return  new Response('entra');
                    $array['id'] = (string)$cita->getId();
                    $array['title'] = $cita->getCliente()->getNombre() . ' '. $cita->getCliente()->getApellido1();
                    $array['empleado'] = $cita->getEmpleado()->getUsername();
                    if ($cita->getInforme()){
                        $array['informe'] = $cita->getInforme()->getId();
                        $array['className'] = 'informe';
                    }
                    else{
                        $array['informe'] = 'NO';
                        $array['className'] = '';
                    }
                    $array['fecha'] = $cita->getFechaoper()->format('d-m-Y H:i:s');
                    $array['start'] = $cita->getFechacita()->format('Y-m-d H:i:s');
                    $array['allDay'] = false;
                array_push($return_arr,$array);
         }

    return  new Response(json_encode($return_arr), 200, array('Content-Type', 'text/json'));
    }

其中变量 $medico 是可以的。但变量 $citas 为空。为什么?

有人知道我做错了吗?问候和感谢。

4

2 回答 2

0

感谢您的回答,但问题不是结果。

这是拥有方, inversedBy 因为您指定了属性:

/**
 * @ORM\ManyToOne(targetEntity="Medico", inversedBy="citas")
*/
protected $medico;

这是反面(因为它具有 mappedBy 属性):

 /**
 * @ORM\OneToMany(targetEntity="Cita", mappedBy="medico")
 */
 protected $citas;

为了让它更干净:

拥有方必须使用 OneToOne inversedBy、ManyToOne 或 ManyToMany 映射声明的属性。inversedBy 属性包含反面关联字段的名称。而对于反面:

双向关系的反面必须通过使用 OneToOne、OneToMany 或 ManyToMany 映射声明的 mappedBy 属性来引用其拥有方。mappedBy 属性指定实体中的字段即关系的所有者。

ManyToOne 始终是双向关联的拥有方。

OneToMany 始终是双向关联的反面。

getter 和 setter 这个生成器与学说: 生成:实体 当我保存医生的预约时,我分配:

$ cita-> setMedico ($medico);

但是当我在医生中做循环时不起作用。这个空白:

$ citas = $ medico-> getCitas ();
         foreach ($ citas as $ cita)

当我保存预约时,医生不需要更新医生的集合吗?谢谢。

于 2012-11-16T10:48:30.123 回答
0

我认为这是因为您从刚刚保存实体的同一工作单元中读取实体。在代码中,您没有填写一对多关联的反面。Doctrine 只有在从存储中加载实体时才会这样做。

如果这是问题所在,您可以通过更改 setter 函数来解决它:

function setMedico($medico) {
     $this->medico = $medico;
     $medico->getCitas->add($this);
}

当然你必须Medico::getCitas()定义方法

function getCitas() {
    return $this->citas;
}

并且 Medico 构造函数必须启动该$citas属性:

function __construct() {
    $this->citas = new \Doctrine\Common\Collections\ArrayCollection();
}
于 2012-11-16T07:12:31.593 回答