1

Webサービスからゲームセッションを削除するために、次のコントローラーを定義しました。

1つのSessionエンティティが削除されることを期待していますが、代わりにすべてのレコードがデータベースから削除されます。

SessionController.php

/**
 * @Route("/{id}/")
 * @Method({"DELETE"})
 */
public function deleteAction($id)
{
    $repository = $this->getSessionRepository();
    $session = $repository->find($id);

    $em = $this->getEntityManager();
    $em->remove($session);
    $em->flush();

    return new Response('', 200);
}

services.ymlには次のものが含まれます。

  sh.repository.session:
    class: ScavengerWebserviceBundle\Entity\SessionRepository
    factory_service: doctrine.orm.default_entity_manager
    factory_method: getRepository
    arguments:
      - 'ScavengerWebserviceBundle:Session'
/**
 * @return \Scavenger\WebserviceBundle\Entity\SessionRepository
 */
private function getSessionRepository()
{
    return $this->container->get('sh.repository.session');
}

エンティティには次のものが含まれます。

<?php

namespace Scavenger\WebserviceBundle\Entity;

use Scavenger\WebserviceBundle\Entity\Battlezone;

use Doctrine\ORM\Mapping as ORM;
use \Doctrine\ORM\Mapping\OneToOne;
use \Doctrine\ORM\Mapping\ManyToMany;
use \Doctrine\ORM\Mapping\JoinTable;
use \Doctrine\ORM\Mapping\JoinColumn;

/**
 * Scavenger\WebserviceBundle\Entity\Session
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Scavenger\WebserviceBundle\Entity\SessionRepository")
 */
class Session
{

    const SESSION_ACTIVE = 0; //lol

    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var integer $mrX
     *
     * @ORM\Column(name="mrX", type="integer")
     */
    private $mrX;


     /**
     * @var integer $causer
     *
     * @ORM\Column(name="causer", type="integer")
     */
    private $causer = 0;


    /**
     * @var integer $statusCode
     *
     * @ORM\Column(name="status_code", type="integer", nullable=false)
     */
    private $statusCode = self::SESSION_ACTIVE;


    /**
     * @ManyToMany(targetEntity="Scavenger\WebserviceBundle\Entity\User", mappedBy="sessions", cascade={"all"})
     */
    private $users;

    /**
     * @OneToOne(targetEntity="Scavenger\WebserviceBundle\Entity\Battlezone", cascade={"all"})
     * @JoinColumn(name="battlezone_id", referencedColumnName="id")
     */
    private $battlezone;

    /**
     * @var integer
     * @ORM\Column(name="start", type="integer") 
     */
    private $start = 0;

    /**
     * @var integer
     * @ORM\Column(name="end", type="integer")
     */
    private $end = 0;


    //a bunch of setters and getters ...
}
4

2 に答える 2

1

これは、$usersフィールドに「cascade=all」を設定したためです。ユーザーエンティティの「セッション」フィールドにも同じカスケードがあると思います。したがって、セッションオブジェクトを削除すると、そのオブジェクトに関連するすべてのユーザーも削除され、これらのユーザーに関連するすべてのセッションオブジェクトも削除されます。

于 2012-08-16T11:07:34.900 に答える
0

find($ id)を介して呼び出すと、データストア全体を指すオブジェクトが呼び出されますが、オブジェクトが指すデータストア内の1つのエンティティにのみ制限する必要があります。

model(可能であれば)に「unsetData」を作成します。

SessionController.php

/**
 * @Route("/{id}/")
 * @Method({"DELETE"})
 */
public function deleteAction($id)
{
    $session = $this->getSessionRepository()->find($id);
    $session->unsetData(); // Logically, unset($session->dataToUnset);
    $em->persist();
    $em->flush();

    return new Response('', 200);
}

参考までに。私はこのコードを試していませんが、そうでない場合は、すでにパスを知っているか、そうでない場合はコメントに戻って並べ替えます。

于 2012-08-16T08:56:22.607 に答える