Doctrine 2와의 관계 (다 대일, 일대일)에 null 대신 0을 사용할 수 있습니까?Doctrine 2 : 관계 대신 null 대신 기본값 0을 사용하십시오.
이제 널 값으로 변경할 수없는 NOT NULL 열을 많이 얻었습니다. MySQL의 기본값을 0으로 변경하면 솔루션 자체가 해결책이되지 않습니다. doctrine은 항상 행 삽입/업데이트를위한 열을 설정합니다.
Doctrine 2와의 관계 (다 대일, 일대일)에 null 대신 0을 사용할 수 있습니까?Doctrine 2 : 관계 대신 null 대신 기본값 0을 사용하십시오.
이제 널 값으로 변경할 수없는 NOT NULL 열을 많이 얻었습니다. MySQL의 기본값을 0으로 변경하면 솔루션 자체가 해결책이되지 않습니다. doctrine은 항상 행 삽입/업데이트를위한 열을 설정합니다.
아니요, 불가능합니다.
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이 0
이 NULL
으로 해석되도록 행동 할 수 없습니다 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();
고심하지 마세요, 나는 고쳐지는 것을 좋아합니다. – Sam
정확하고 명확한 대답을 해주셔서 감사합니다. –
나쁘다는 것을 알고 있지만, 우리는 단지'postLoad' 이벤트를 사용하여 0 값 fk를'null'로 설정했습니다. 일하는 것 같습니다. 코드에 대한 아래의 응답을 참조하십시오. – Florian