2013-03-19 25 views
6

için null yerine varsayılan 0 değerlerini kullanın Doctrine 2 ile ilişkiler (nüm-to, bire bir) için null yerine 0 değerini kullanmak mümkün müdür?Doctrine 2:

Artık pek çok NOT NULL sütun cadı var, boş değerlere değişmeyebilir. MySQL'deki varsayılan değeri 0'a değiştirmek o kadar özlü bir çözüm değildir, çünkü her zaman satırları eklemek/güncellemek için sütunu ayarlar.

cevap

8

Hayır, bu mümkün değil. SQL'de çok özel bir anlamı vardır. Bu "hiçbir değeri" temsil eder ve size mantık bile, SQL düzeyinde çalışmaz doğrulayabilirsiniz: bu değil, çünkü

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! */ 

Yani hayır, sen Doktrin ORM 0NULL olarak yorumlanır böylece davranmak olamaz RDBMS'nin kendisi tarafından izin verildi. varlık açısından

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

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

, oldukça benzer: Ne varlıklar olarak su katıldığında sonra null object olarak hareket edecek senin DB "sahte" referanslı girdileri, ekleme yapabileceğim

.

(. Gerçi, public özellikleri SADECE henüz yayınlanmamış olan Doktrin ORM 2.4, gelen Buraya okumak için işleri kolaylaştırmak desteklenmektedir unutmayınız)

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; 
} 

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; 
} 

Ve sonra kod üretmek için yeni bir Foo örneği:

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

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

Hiç sert duygular yok, düzeltilmek istiyorum :) – Sam

+1

Doğru ve açık cevabınız için teşekkürler. –

+0

Kötü olduğunu biliyorum, ancak sıfır değerli fk değerini "null" olarak ayarlamak için bir "postLoad" etkinliği kullandık. İşe benziyor. kod için aşağıya bakınız. – Florian

İlgili konular