簡體   English   中英

symfony2關系學說

[英]symfony2 relations doctrine

您好,我正在使用Symfony2,並且有以下關系:

表medico:

/**
* @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為空。 為什么?

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

我認為這是因為您從持久化實體的同一工作單元中讀取了實體。在代碼中,您沒有填寫一對多關聯的反面。 只有在從存儲中加載實體時,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();
}

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

這是擁有方inversedBy,因為您指定了屬性:

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

這是反面(因為它具有MapdBy屬性):

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

為了使其更干凈:

擁有方必須使用OneToOne inversedBy,ManyToOne或ManyToMany映射聲明的屬性。 inversedBy屬性包含反側的關聯字段的名稱。 而對於反面:

雙向關系的反面必須使用OneToOne,OneToMany或ManyToMany映射聲明的mapledBy屬性引用其所屬的面。 mapledBy屬性指定實體中作為關系所有者的字段。

ManyToOne始終是雙向關聯的擁有方。

OneToMany始終是雙向關聯的反面。

吸氣和setter這種發電機學說:當我節省了醫生的約會,我分配entitites:產生:

$ cita-> setMedico ($medico);

但是當我這樣做時,醫師無法正常工作。 此空白:

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

當我保存約會時,醫生將不必更新醫生的病歷嗎? 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM