2012-11-15 3 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.'return' 절로 인해'pintarAction' 메소드가'foreach' 루프에 입력하자마자 종료됩니다. 2. db가 선택된 medico에 대한 실제 데이터를 가지고 있는지 확인하십시오. 3. 화 내지 마세요, [FOSRestBundle] (https://github.com/FriendsOfSymfony/FOSRestBundle)을 사용하십시오! – moonwave99

답변

0

저는 엔티티를 그대로 유지 한 동일한 작업 단위에서 엔티티를 읽었 기 때문에 생각합니다. 코드에서 일대 다 연관의 반대면을 채우지 않았습니다. Doctrine은 저장소의 엔티티를로드하는 경우에만이를 수행합니다. 그게 문제가 있다면

, 당신은 setter 함수를 변경하여 해결할 수 있습니다 :

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

은 물론 당신은 $citas 속성을 시작해야

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

그리고 메디 생성자를 정의 Medico::getCitas() 방법이 있어야합니다

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

답변 해 주셔서 감사합니다. 문제는 결과가 아니 었습니다.

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

이 더 깨끗하고 만들려면 : (그것은 mappedBy 속성이 있기 때문에)

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

이 역 측면은 다음과 같습니다

이 소유 측은 inversedBy 당신은 속성을 지정하기 때문에,이다 :

소유 측은 OneToOne inversedBy, ManyToOne 또는 ManyToMany 매핑 선언의 특성을 사용해야합니다. inversedBy 속성은 inverse-side에있는 association-field의 이름을 포함합니다. 반면, 반대쪽 :

양방향 관계의 반대면은 OneToOne, OneToMany 또는 ManyToMany 매핑 선언의 mappedBy 특성을 사용하여 소유 측면을 참조해야합니다. mappedBy 속성은 관계의 소유자 인 엔터티의 필드를 지정합니다.

ManyToOne은 항상 양방향 할당의 소유 측면입니다.

OneToMany는 항상 양방향 할당의 반대면입니다.

게터와 세터 교리이 생성 : 생성은 : entitites 내가 의사의 약속을 저장할 때 나는 할당합니다

$ cita-> setMedico ($medico); 

을하지만 의사의 루프를 수행 할 때 작동하지. 이 공란 :

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

약속을 저장할 때 의사가 의사 콜렉션을 업데이트 할 필요가 없습니까? 덕분에 .