mysql Doctrine2将不可变字段移动到单独的类中

ggazkfy8  于 5个月前  发布在  Mysql
关注(0)|答案(4)|浏览(56)

我需要将一些不可变的字段移到单独的类中,但我并不真的想使用“join”,因为我每次都需要将所有数据放在一起。
有没有办法把一些实体属性作为Map到同一个表中的类?
类似于:

/**
 * @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;
    ...
}

字符串
表结构为:

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`)
);

xmjla07d

xmjla07d1#

你问的是价值对象。
在Jira DDC-93中有一个开放的问题需要添加支持。它目前标记为在2.5版本中解决,该版本刚刚在Beta中发布。

krcsximq

krcsximq2#

如果你想存储没有join的对象:

/**
 * @ORM\Column(name="adress", type="object")
 */

字符串
它将自动序列化/重新序列化到文本字段
http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html
并添加setter与类型你想存储

public function setAdress(Address $adress)
{
    $this->adress = $adress;

    return $this;
}


地址类不需要任何@ORM注解

ogq8wdun

ogq8wdun3#

就像你说的那样。
User中添加@PreUpdate和@PostLoad钩子。

/**
 * @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);
    }
}

字符串

i7uq4tfw

i7uq4tfw4#

Doctrine在2.x版本中引入了值对象的概念。
新属性/注解的名称是EmbeddableEmbedded。第一个用于标记值对象类,第二个用于实际将值对象注入父实体。
下面是我最初问题的更新代码片段:

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

    /** @ORM\Embedded(class="Address", columnPrefix="address") */
    protected $address
}

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

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

字符串
资源:

相关问题