1

これで頭を悩ませています。Android アプリにデータを提供する symfony 2 json API があります。

API はデータをシリアライズし、JMSSerializerBundle を使用してまったく問題なくアプリに送信します。次に、GSON を使用してネイティブ Java オブジェクトに逆シリアル化します。

その後、私のアプリは変更を加え、データを API に戻します。

私の問題は、アプリから送信されたjsonを逆シリアル化し、永続化/マージしようとすると、既存のエンティティのデータベースに新しいオブジェクトが作成されることです。symfony 2 はオブジェクトが新しいかどうかを判断できますか? レコードに Id があれば、それが更新され、作成されていないことがわかると思いました。

これが私のコントローラーコードです:

public function postSuggestionAction()
{

    $content = $this->get("request")->getContent();

    if (!empty($content))
    {
        $serializer = $this->get('jms_serializer');
        $suggestion = $serializer->deserialize($content, 'Calling\WebBundle\Entity\Suggestion', 'json');

        $em = $this->getDoctrine()->getManager();
        $em->persist($suggestion);
        $em->merge($suggestion->getCategory());
        $em->merge($suggestion->getNumber());
        $em->merge($suggestion->getCaller());
        $em->flush();

        $view = $this->view(true, 200);
        return $this->handleView($view);

    }

    $view = $this->view(false, 404);
    return $this->handleView($view);



}

前もって感謝します スティーブ

4

1 に答える 1

1

アップデート

EntityManager::merge() メソッドが実際に機能するはずです。ただし、エンティティのマッピングには cascade=MERGE または cascade=ALL オプションが必要です。コードは次のようになります。

public function postSuggestionAction()
{

    $content = $this->get("request")->getContent();

    if (!empty($content))
    {
        $serializer = $this->get('jms_serializer');
        $detachedSggestion = $serializer->deserialize($content, 'Calling\WebBundle\Entity\Suggestion', 'json');

        $em = $this->getDoctrine()->getManager();
        $suggestion = $em->merge($detachedSuggestion);
        $em->flush();

        $view = $this->view(true, 200);
        return $this->handleView($view);

    }

    $view = $this->view(false, 404);
    return $this->handleView($view);



}

元の回答 いいえ、それを行う方法はありません。識別可能な (一意の) 列に基づいてエンティティについて Doctrine にクエリを実行する以外に方法はありません。最善の方法は JSON から ID を取得することですが、そうでない場合は、エンティティを比較してそれらが等しいかどうかを確認する方法が必要になります。次に、DB からクエリを実行できます。

ロジックは次のようになります。

  • DB でオブジェクトを検索します ( SELECT s FROM Suggestion WHERE s.id = :id; ID がある場合)
  • オブジェクトまたは null を返します。null の場合はロジックを保持し、それ以外の場合は JSON からオブジェクトへの変更を反映してから、永続化して保存します。
于 2013-04-04T15:52:46.423 に答える