2012-11-15 110 views
0

你好我與Symfony2的工作,我有這些關係: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')); 
    } 

其中變量$法醫學是確定的。但變量$ citas是空的。爲什麼?

有人知道我做錯了嗎?問候和感謝。

+0

1.您的'pintarAction'方法將在您輸入'foreach'循環時立即退出,這是由於'return'子句; 2.檢查你的db是否有選定的medico的真實數據; 3.不要生氣,使用[FOSRestBundle](https://github.com/FriendsOfSymfony/FRestBundle)! – moonwave99

回答

0

我認爲這是因爲您從剛剛持久實體的同一工作單元中讀取實體。在代碼中,您沒有填充「一對多」關聯的反面。 Doctrine只在從存儲裝載實體時才執行此操作。

如果是這樣的問題,你可以通過改變setter函數修正:

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

當然,你必須有Medico::getCitas()定義

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

和醫構造必須啓動$citas屬性方法:

function __construct() { 
    $this->citas = new \Doctrine\Common\Collections\ArrayCollection(); 
} 
0

感謝您的回答,但th問題不是結果。

這是擁有方,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這種發電機學說:生成:entitites當我節省了醫生的約會,我分配:

$ cita-> setMedico ($medico); 

但是當我做了環路醫生無法正常工作。此空白:

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

當我保存約會時,醫生將不必更新醫生的集合? 謝謝。