2017-10-22 11 views
2

エンティティEndpointEndpointServerConfig、およびServerありますDocrine 2で関係を完全に削除するにはどうすればいいですか?

enter image description here

/** 
* 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.serverNULLに設定する必要があります。

FooZend\Formにロードし、サーバーを無効にして変更を送信します。サーバー側では、私は、設定を解除EndpointServerConfig#serverFooオーバー:

/** @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はServerUPDATEしようEndpointServerConfigからしかし、なぜ?

手動でendpoint_server_config.server_nameNULL(データベースに直接)に設定した場合のみ、フォームと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) 

答えて

0

は、以下を追加します。 - あなたの関係上、

cascade={"persist", "remove"} 

@ORM\ManyToOne(targetEntity="Server", cascade={"persist", "remove"})  
関連する問題