2013-03-19 2 views
6

Doctrine 2와의 관계 (다 대일, 일대일)에 null 대신 0을 사용할 수 있습니까?Doctrine 2 : 관계 대신 null 대신 기본값 0을 사용하십시오.

이제 널 값으로 변경할 수없는 NOT NULL 열을 많이 얻었습니다. MySQL의 기본값을 0으로 변경하면 솔루션 자체가 해결책이되지 않습니다. doctrine은 항상 행 삽입/업데이트를위한 열을 설정합니다.

답변

8

아니요, 불가능합니다.

NULL은 SQL에서 매우 특정한 의미를 갖습니다. 그것은 "값"을 대표하지 않으며, 당신은 당신의 논리도 SQL 수준에서 작동하지 않습니다 확인할 수 있습니다 : 그것은 아니에요 이후,

CREATE TABLE foo (
    `id` INT(11) PRIMARY KEY AUTO_INCREMENT, 
    `bar_id` INT(11) 
); 

CREATE TABLE `bar` (`id` INT(11) PRIMARY KEY AUTO_INCREMENT); 

ALTER TABLE foo ADD FOREIGN KEY `bar_id_fk` (`bar_id`) REFERENCES `bar` (`id`); 

INSERT INTO `bar` VALUES (NULL); 
INSERT INTO `bar` VALUES (NULL); 
INSERT INTO `bar` VALUES (NULL); 
INSERT INTO `foo` VALUES (NULL, 1); 
INSERT INTO `foo` VALUES (NULL, 2); 
INSERT INTO `foo` VALUES (NULL, 3); 
INSERT INTO `foo` VALUES (NULL, 0); 

/* 
    ERROR 1452 (23000): 
     Cannot add or update a child row: a foreign key constraint fails 
     (`t2`.`foo`, CONSTRAINT `foo_ibfk_1` FOREIGN KEY (`bar_id`) 
     REFERENCES `bar` (`id`)) 
*/ 

INSERT INTO `foo` VALUES (NULL, 4); 

/* 
    ERROR 1452 (23000): 
     Cannot add or update a child row: a foreign key constraint fails 
     (`t2`.`foo`, CONSTRAINT `foo_ibfk_1` FOREIGN KEY (`bar_id`) 
     REFERENCES `bar` (`id`)) 
*/ 

INSERT INTO `foo` VALUES (NULL, NULL); /* VALID! */ 

그래서 아니, 교리 ORM이 0NULL으로 해석되도록 행동 할 수 없습니다 RDBMS 자체에서 허용됩니다. 엔티티 측면에서

INSERT INTO `bar` VALUES (NULL); 
UPDATE `bar` SET `id` = 0 WHERE `id` = 4; 

INSERT INTO `foo` VALUES (NULL, 0); /* now works! */ 

, 그것은 아주 비슷합니다 : 당신이 단체로 수화 때 다음 null object 역할을하여 DB에 "가짜"참조 항목을 삽입한다 할 수

.

(.하지만, public 속성 만 아직 발표되지 않은 교리 ORM 2.4에서 그들이 여기 읽을 일이 쉽게 지원하는 점에 유의하시기 바랍니다)

Foo.php :

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity() 
* @ORM\Table(name="foo") 
*/ 
class Foo 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id() 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Bar") 
    * @ORM\JoinColumn(name="bar_id", referencedColumnName="id", nullable=false) 
    */ 
    public $bar; 
} 

바 .PHP :

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity() 
* @ORM\Table(name="bar") 
*/ 
class Bar 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id() 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 
} 

그리고 코드가 생산하는 새로운 Foo 예 :

,
$nullBar = $entityManager->find('Bar', 0); 
$foo  = new Foo(); 
$foo->bar = $nullBar; 

$em->persist($foo); 
$em->flush(); 
+0

고심하지 마세요, 나는 고쳐지는 것을 좋아합니다. – Sam

+1

정확하고 명확한 대답을 해주셔서 감사합니다. –

+0

나쁘다는 것을 알고 있지만, 우리는 단지'postLoad' 이벤트를 사용하여 0 값 fk를'null'로 설정했습니다. 일하는 것 같습니다. 코드에 대한 아래의 응답을 참조하십시오. – Florian

관련 문제