symfony2 deleteForm 不能正常工作
symfony2 deleteForm not working fine
我有 2 个实体。我想删除服务行。
我试过了:
$em = $this->getDoctrine()->getEntityManager();
$service = $em->getRepository('AppBundle:Service')->find(1);
$em->删除($service);
$em->flush();
这样它就删除了所有包含该类别 ID 的行。抱歉我的英语不好。让我用另一种方式向你解释:
BEFORE AFTER delete id 1 from service
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
+ id + ca_ + + id + se_ + ca_ + + id + ca_ + + id + se_ + ca_ +
+ + name + + + name + id + + + name + + + name + id +
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
+ 1 + A + + 1 + A1 + 1 + + + + + + + +
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
+ 2 + B + + 2 + A2 + 1 + + 2 + B + + + + +
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
+ 3 + C + + 3 + B1 + 2 + + 3 + C + + 3 + B1 + 2 +
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
我该如何解决?
服务实体:
/**
* Service
*
* @ORM\Table(name="service")
* @ORM\Entity(repositoryClass="AppBundle\Repository\ServiceRepository")
*/
class Service {
...
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="services", cascade={"persist","remove"})
* @ORM\JoinColumn(onDelete="CASCADE")
*/
private $caId;
/**
* Set caId
*
* @param \AppBundle\Entity\Category $caId
*
* @return Service
*/
public function setCaId(\AppBundle\Entity\Category $caId = null)
{
$this->caId = $caId;
return $this;
}
/**
* Get caId
*
* @return \AppBundle\Entity\Category
*/
public function getCaId()
{
return $this->caId;
}
}
类别实体:
/**
* Category
*
* @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
*/
class Category {
...
/**
* @ORM\OneToMany(
* targetEntity="Service",
* mappedBy="caId"
* )
*/
private $services;
/**
* Constructor
*/
public function __construct()
{
$this->services = new ArrayCollection();
}
/**
* Get orders
*
* @return Collection
*/
public function getServices()
{
return $this->services;
}
}
我发现您的映射配置有两个问题:
在您的 Service
实体中,您已配置级联删除操作。这意味着当 Service
对象被删除时,与它关联的 Category
实体也将被删除。
映射中的第二个关键部分是 @ORM\JoinColumn(onDelete="CASCADE")
。在数据库级别,这会产生这样的效果,即当 category
table 中的条目被删除时(由于 1 而发生),service
table 中引用的每条记录到已删除的类别,将被删除到(这就是第二个服务丢失的原因)。
从您的模型来看,我假设将 Service
实体中的 cascade={"persist", "remove"}
更改为仅 cascade={"persist"}
就足够了(也许您甚至不需要级联持久操作)。
我有 2 个实体。我想删除服务行。
我试过了:
$em = $this->getDoctrine()->getEntityManager();
$service = $em->getRepository('AppBundle:Service')->find(1);
$em->删除($service);
$em->flush();
这样它就删除了所有包含该类别 ID 的行。抱歉我的英语不好。让我用另一种方式向你解释:
BEFORE AFTER delete id 1 from service
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
+ id + ca_ + + id + se_ + ca_ + + id + ca_ + + id + se_ + ca_ +
+ + name + + + name + id + + + name + + + name + id +
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
+ 1 + A + + 1 + A1 + 1 + + + + + + + +
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
+ 2 + B + + 2 + A2 + 1 + + 2 + B + + + + +
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
+ 3 + C + + 3 + B1 + 2 + + 3 + C + + 3 + B1 + 2 +
+----+------+ +----+------+-----+ +----+------+ +----+------+-----+
我该如何解决?
服务实体:
/**
* Service
*
* @ORM\Table(name="service")
* @ORM\Entity(repositoryClass="AppBundle\Repository\ServiceRepository")
*/
class Service {
...
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="services", cascade={"persist","remove"})
* @ORM\JoinColumn(onDelete="CASCADE")
*/
private $caId;
/**
* Set caId
*
* @param \AppBundle\Entity\Category $caId
*
* @return Service
*/
public function setCaId(\AppBundle\Entity\Category $caId = null)
{
$this->caId = $caId;
return $this;
}
/**
* Get caId
*
* @return \AppBundle\Entity\Category
*/
public function getCaId()
{
return $this->caId;
}
}
类别实体:
/**
* Category
*
* @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
*/
class Category {
...
/**
* @ORM\OneToMany(
* targetEntity="Service",
* mappedBy="caId"
* )
*/
private $services;
/**
* Constructor
*/
public function __construct()
{
$this->services = new ArrayCollection();
}
/**
* Get orders
*
* @return Collection
*/
public function getServices()
{
return $this->services;
}
}
我发现您的映射配置有两个问题:
在您的
Service
实体中,您已配置级联删除操作。这意味着当Service
对象被删除时,与它关联的Category
实体也将被删除。映射中的第二个关键部分是
@ORM\JoinColumn(onDelete="CASCADE")
。在数据库级别,这会产生这样的效果,即当category
table 中的条目被删除时(由于 1 而发生),service
table 中引用的每条记录到已删除的类别,将被删除到(这就是第二个服务丢失的原因)。
从您的模型来看,我假设将 Service
实体中的 cascade={"persist", "remove"}
更改为仅 cascade={"persist"}
就足够了(也许您甚至不需要级联持久操作)。