To delete a game Session from a web service we have defined the following controller.
I expect one Session entity to be deleted, instead all records get deleted from the database.
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);
}
The services.yml contains:
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');
}
The entity contains:
<?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 ...
}
It’s because you’ve set “cascade=all” on $users field. I guess you have also the same cascade on “sessions” field in User entity, therefore if you remove some session object, all users related with that object will be removed as well AND all session objects related to these users will be removed too.