0

こんにちは、私は Symfony2 を使用しています。これらの関係があります。

テーブルメディコ:

/**
* @ORM\OneToMany(targetEntity="Cita", mappedBy="medico")
*/
protected $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

これは、エンティティを永続化したのと同じ作業単位からエンティティを読み取ったためだと思います。コードでは、1対多の関連付けの逆の側面を埋めていません。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();
}
于 2012-11-16T07:12:31.593 に答える
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 は、常に双方向関連の逆側です。

doctrine: generate: entitites を使用して、このジェネレーターを getter および setter します。

$ cita-> setMedico ($medico);

しかし、医師のループを実行すると機能しません。この空白:

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

予約を保存すると、医師は医師のコレクションを更新する必要がなくなりますか? ありがとう。

于 2012-11-16T10:48:30.123 に答える