Doctrine orm 如何在Docrine 2中干净地删除关系?

Doctrine orm 如何在Docrine 2中干净地删除关系?,doctrine-orm,doctrine,persistence,cascade,Doctrine Orm,Doctrine,Persistence,Cascade,有实体Endpoint、EndpointServerConfig和Server: /** * 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", c

有实体
Endpoint
EndpointServerConfig
Server

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

现在我想更新一个包含
端点的实体(例如
Foo
)。在其他更改中,我希望从
端点
端点服务器配置
中删除对
服务器的引用。这意味着对于数据库:
endpoint\u server\u 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)
这意味着,条令试图
更新
服务器
,而不仅仅是从
端点服务器配置
中删除对它的引用。但是为什么呢

只有当我手动将
endpoint\u server\u config.server\u name
设置为
NULL
(直接在数据库中)时,我才能通过表单和命令保存更改

如何让它工作?


编辑

刚刚注意到,每次更新
EndpointServerConfig
时,我都会遇到同样的问题。因此,不仅在
setServer(null)
上,而且在我尝试设置新的
服务器时也是如此。在这种情况下,尝试会导致错误:

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)
添加以下内容:-

 cascade={"persist", "remove"} 
你的亲戚

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