【问题标题】:How to remove a relationship cleanly in Docrine 2?如何在教义 2 中彻底删除关系?
【发布时间】:2023-03-14 19:26:02
【问题描述】:

有实体EndpointEndpointServerConfigServer

/**
 * Server
 *
 * @ORM\Table(
 *     name="server",
 *     indexes={
 *         @ORM\Index(name="fk_server_server_type_idx", columns={"server_type_id"}),
 *         @ORM\Index(name="fk_server_cluster_idx", columns={"cluster_id"})
 *     }
 * )
 * @ORM\Entity
 */
class Server
{
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=32, nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     *
     * @Groups({"export"})
     */
    protected $name;

    /**
     * @var EndpointServerConfig[]
     */
    protected $endpointServerConfigs;
}

/**
 * EndpointServerConfig
 *
 * @ORM\Table(name="endpoint_server_config", indexes={
 *     @ORM\Index(name="fk_endpoint_server_config_server_idx", columns={"server_name"})}
 * )
 * @ORM\Entity
 */
class EndpointServerConfig
{

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @var Server
     *
     * @ORM\ManyToOne(targetEntity="Server")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="server_name", referencedColumnName="name")
     * })
     *
     * @Groups({"export"})
     */
    protected $server;

    /**
     * @var Endpoint
     *
     * @ORM\OneToOne(targetEntity="Endpoint", mappedBy="endpointServerConfig")
     */
    protected $endpoint;
}

/**
 * Endpoint
 *
 * @ORM\Table(
 *     name="endpoint",
 *     indexes={
 *         ...
 *         @ORM\Index(name="fk_endpoint_endpoint_server_config_idx", columns={"endpoint_server_config_id"}),
 *         ...
 *     }
 * )
 * @ORM\Entity
 * ...
 */
class Endpoint
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;
}

现在我想更新一个包含Endpoint 的实体(例如Foo)。在其他更改中,我想从EndpointEndpointServerConfig 中删除对Server 的引用。这意味着对于数据库:endpoint_server_config.server 需要设置为 NULL

我将Foo 加载到Zend\Form,禁用服务器并提交更改。在服务器端,我在 Foo 上取消设置 EndpointServerConfig#server

/** @var Foo $myFoo */
if(! $myFoo->getEndpoint()->getEndpointServerConfig()->getServer() || ! $myFoo->getEndpoint()->getEndpointServerConfig()->getServer()->getName()) {
    $myFoo->getEndpoint()->getEndpointServerConfig()->setServer(null);
}
$this->entityManager->persist($myFoo);
$this->entityManager->flush($myFoo);

导致错误:

An exception occurred while executing 'UPDATE server SET name = ? WHERE name = ?' with params ["", "someservername"]:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`mydb`.`endpoint_server_config`, CONSTRAINT `fk_endpoint_server_config_server` FOREIGN KEY (`server_name`) REFERENCES `server` (`name`) ON DELETE NO ACTION ON UPDATE NO ACTION)

这意味着,Doctrine 尝试将UPDATEServer 联系起来,而不是仅仅从EndpointServerConfig 中删除对它的引用。但为什么呢?

只有当我手动将endpoint_server_config.server_name设置为NULL(直接在数据库中)时,我才能通过表单和Doctrine保存更改。

如何让它工作?


编辑

刚刚注意到,我在每次更新 EndpointServerConfig 时都会遇到同样的问题。所以不仅在setServer(null) 上,当我尝试设置一个新的Server 时也是如此。在这种情况下,尝试会导致错误:

An exception occurred while executing 'UPDATE server SET name = ? WHERE name = ?' with params ["newservername", "someservername"]:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`mydb`.`endpoint_server_config`, CONSTRAINT `fk_endpoint_server_config_server` FOREIGN KEY (`server_name`) REFERENCES `server` (`name`) ON DELETE NO ACTION ON UPDATE NO ACTION)

【问题讨论】:

    标签: doctrine-orm doctrine persistence cascade


    【解决方案1】:

    添加以下内容:-

     cascade={"persist", "remove"} 
    

    关于你们的关系。

     @ORM\ManyToOne(targetEntity="Server", cascade={"persist", "remove"})    
    

    【讨论】:

      猜你喜欢
      • 2016-05-31
      • 2021-10-01
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多