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;
 }
}

我发现您的映射配置有两个问题:

  1. 在您的 Service 实体中,您已配置级联删除操作。这意味着当 Service 对象被删除时,与它关联的 Category 实体也将被删除。

  2. 映射中的第二个关键部分是 @ORM\JoinColumn(onDelete="CASCADE")。在数据库级别,这会产生这样的效果,即当 category table 中的条目被删除时(由于 1 而发生),service table 中引用的每条记录到已删除的类别,将被删除到(这就是第二个服务丢失的原因)。

从您的模型来看,我假设将 Service 实体中的 cascade={"persist", "remove"} 更改为仅 cascade={"persist"} 就足够了(也许您甚至不需要级联持久操作)。