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"})