Symfony2/原则:一对一,嵌入式实体



我要开始严肃的教条游戏。

在我目前面临的挑战中,我必须建立一个包含地址的实体。让我们举一个例子。

class Address {
    private $country;
    private $street;
}
class Person {
    private $name;
    /**
     * @var Address
     */
    private $address;
}

我想要实现的是在数据库中只有一个表,并在Person中嵌入Address。类似的东西:

create table Person {
     name string(255),
     street string(255),
     country string(255)
}

我知道这在像Hibernate这样的ORM中是可能的,我希望我在Doctrine中也能有同样的行为。

我如何与Doctrine建立嵌入的一对一关系

不幸的是,Doctrine的ORM不支持嵌入式对象。到目前为止,我发现的唯一灵魂就是自己绘制地图:
class Person {
    ...
    protected $addressName;
    protected $addressStreet;
    protected $addressCountry;
    public function getAddress() {
        return new Address($this->addressName, $this->addressStreet, $this->addressCountry);
        // or Address::create(...) if you wan't to have a simple constructor
    }
    public function setAddress(Address $address) {
        $this->addressName = $address->getName();
        $this->addressStreet = $address->getStreet();
        $this->addressCountry = $address->getCountry();
    }
    ...
}

这是大量重复的代码,所以您可以考虑将其转移到单独的特性中。

最新更新