エンティティEndpoint
、EndpointServerConfig
、およびServer
ありますDocrine 2で関係を完全に削除するにはどうすればいいですか?
/**
* 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
)を、更新したいが。他の変更の中で、Endpoint
のEndpointServerConfig
からServer
への参照を削除したいと思います。データベースの意味:endpoint_server_config.server
はNULL
に設定する必要があります。
Foo
をZend\Form
にロードし、サーバーを無効にして変更を送信します。サーバー側では、私は、設定を解除EndpointServerConfig#server
Foo
オーバー:
/** @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はServer
をUPDATE
しようEndpointServerConfig
からしかし、なぜ?
手動でendpoint_server_config.server_name
をNULL
(データベースに直接)に設定した場合のみ、フォームとDoctrineを介して変更を保存できます。
どのように動作させるには?
EDIT
ちょうど私が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)