1

私はこの関数 duplicateCourseAction を持っており、その目標は ... Course オブジェクトを複製することです

public function duplicateCourseAction(Request $request) {
    if ($this->getRequest()->isXmlHttpRequest() == false) {
        return new Response("Bad request", 405);
    }

    $em = $this->getDoctrine()->getManager();
    $parameters = $request->request->all();
    $course = $em->getRepository('EntTimeBundle:Course')->findOneById($parameters['id']);
    $duplicate = clone $course;
    $duplicate->setDate(new \DateTime($parameters['date']));
    $em->persist($duplicate);
    $em->flush();
    return new Response("200");
}

ドキュメントによると、「clone」キーワードは表面コピー (参照コピー) を作成します。Course エンティティには他のエンティティとの多くの関係が含まれているため、これは明らかに私が望んでいるものではありません。値のコピーが必要です。

unserialize(serialize(object)) トリックを発見しました:

public function duplicateCourseAction(Request $request) {
    if ($this->getRequest()->isXmlHttpRequest() == false) {
        return new Response("Bad request", 405);
    }

    $em = $this->getDoctrine()->getManager();
    $parameters = $request->request->all();
    $course = $em->getRepository('EntTimeBundle:Course')->findOneById($parameters['id']);
    $duplicate = unserialize(serialize($course));
    $duplicate->setDate(new \DateTime($parameters['date']));
    $em->persist($duplicate);
    $em->flush();
    return new Response("200");
}

しかし、私は Doctrine でこのエラーがあります:

注意: 未定義のインデックス: /home/mart_q/Diderot/ent/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php 行 2776 の 000000003ed2e9ea00000000ee270fde

4

2 に答える 2

0

ここでの秘訣は、重複するエンティティ ID の設定を解除する必要があることです。そうでなければ、教義の論理を破ります。Doctrine にはいくつかの既知の制限があります。また、この質問を確認してください。非常によく似ています。

于 2013-09-03T13:21:40.983 に答える
0

エンティティの__clone()メソッドをオーバーライドすることで、正確に複製されるものを制御できます。ディープ コピーが必要な場合は、参照オブジェクトCourseを設定idして複製できます。null

シリアライゼーション/アンシリアライゼーションはハックのように感じるので、使用しないことをお勧めします。

于 2013-09-03T15:47:42.873 に答える