2013-10-10 20 views
12

Potrzebuję przenieść niektóre niezmienne pola do oddzielnej klasy, ale tak naprawdę nie chcę używać "dołączania", ponieważ potrzebuję wszystkich danych razem za każdym razem.Doctrine2 przenosi niezmienne pola do oddzielnej klasy

Czy istnieje jakiś sposób, aby niektóre atrybuty encji były klasami odwzorowanymi na tę samą tabelę?

Coś jak:

/** 
* @ORM\Entity 
*/ 
class User { 
    /** 
    * @var int 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
    ... 

    /** 
    * @var Address 
    * @ORM\... ?? 
    */ 
    protected $address 
} 

/** 
* @ORM\ValueObject ?? 
*/ 
class Address { 
    /** 
    * @var string 
    * @ORM\Column(type="string", name="address_zipcode", length=12) 
    */ 
    protected $zipcode; 

    /** 
    * @var string 
    * @ORM\Column(type="string", name="address_country_iso", length=3) 
    */ 
    protected $countryIso; 
    ... 
} 

i struktura stół byłoby:

CREATE TABLE User (
    `id` INT(11) NOT NULL auto_increment, 
    `address_zipcode` VARCHAR(12) NOT NULL, 
    `address_country_iso` VARCHAR(3) NOT NULL, 
    PRIMARY KEY (`id`) 
); 
+5

Prawdopodobnie [tutaj] (http://stackoverflow.com/questions/8440879/doctrine-2-value-objects) można znaleźć odpowiedź na to pytanie. –

+1

Wielkie dzięki, właśnie tego szukam –

Odpowiedz

0

To będzie tak jak mówiłeś, że coś podobnego.

Dodaj @PreUpdate i @PostLoad hook do User.

/** 
* @ORM\Entity 
*/ 
class User { 
    /** 
    * @var int 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
    ... 

    /** 
    * @var Address 
    * (NOTE: no @ORM annotation here) 
    */ 
    protected $address 

    /** 
    * @var string 
    * @ORM\Column(type="string") 
    */ 
    protected $addressZipCode; 

    /** 
    * @var string 
    * @ORM\Column(type="string") 
    */ 
    protected $addressCountryIso; 

    public function setAddress(Address $address) 
    { 
     $this->address = $address; 
    } 

    /** 
    * @ORM\PreUpdate 
    * 
    * set $addressZipCode and $addressCountryInfo when this object is to 
    * save so that doctrine can easily save these scalar values 
    */ 
    public function extractAddress() 
    { 
     $this->addressZipCode = $this->address->getZipCode(); 
     $this->addressCountryIso = $this->address->getAddressCountryIso(); 
    } 

    /** 
    * @ORM\PostLoad 
    * 
    * When the row is hydrated into this class, 
    * $address is not set because that isn't mapped. 
    * so simply, map it manually 
    */ 
    public function packAddress() 
    { 
     $this->address = new Address(); 
     $this->address->setZipCode($this->addressZipCode); 
     $this->address->setCountryIs($this->addressCountryIso); 
    } 
} 
1

To, o co pytasz, nazywa się obiektami wartości.

Tam był otwarty problem Jira DDC-93, aby dodać obsługę. Jest on oznaczony jako rozwiązany w wersji 2.5, która została właśnie wydana w wersji Beta.

Powiązane problemy