您好我正在使用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是空的。为什么呢?
有人知道我做错了吗?问候和感谢。答案 0 :(得分:0)
我认为这是因为你从同一个工作单元中读取了实体,这些实体只是将实体保存在。在代码中,你没有填写一对多关联的反面。 Doctrine仅在从存储中加载实体时才会这样做。
如果这是问题所在,您可以通过更改设置器功能来修复它:
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();
}
答案 1 :(得分:0)
感谢您的回答,但问题不在于结果。
这是拥有方,反转因为您指定了属性:
/**
* @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始终是双向关联的反面。
getters and setter这个生成器带有doctrine:generate:entitites当我保存医生的约会时我指定:
$ cita-> setMedico ($medico);
但是当我在医生的循环中不工作时。这个空白:
$ citas = $ medico-> getCitas ();
foreach ($ citas as $ cita)
当我保存预约时,医生不必更新医生的收集? 感谢。