Doctrine 2可以将对象属性映射到实体'表?

时间:2014-08-01 17:43:28

标签: php orm doctrine-orm datamapper

我正在使用Doctrine2来管理用户的项目。 因此,用户对象具有一组帐户对象。 这些帐户对象的会计期间包含期间开始和结束的日期时间。

/** @Entity */
class Account
{
    /** @Column(type="datetime") */
    private periodStart;

    /** @Column(type="datetime") */
    private periodEnd;
}

由于我必须在帐户类中添加一些方法,这应该处理句点,我认为重构句点属性并将它们放在自己的类中使用新方法是一种好习惯。类似的东西:

/** @Entity */
class Account
{
    /** ??? */
    private accountPeriod;
}

/** @Entity */
class AccountPeriod
{
    /** @Column(type="datetime") */
    private periodStart;

    /** @Column(type="datetime") */
    private periodEnd;

    public function doSomething(){...}
}

但是Doctrine2会为AccountPeriod创建一个新表。

我想要的是在Account表中保留periodStart和periodEnd列。我搜索它但找不到任何东西 - 我也查看了自定义类型,但据我所知,它们只映射简单类型而不是聚合。

我还想在查询中使用这些列,因此doctrine列类型'object'是没有选项的。

以前有人这样做过,也许还有一些技巧? 或者Doctrine2是不可能的?

1 个答案:

答案 0 :(得分:0)

上述情况的答案是Embeddables

Embeddables是不是实体本身的类,但是嵌入在实体中,也可以在DQL中查询。您通常会希望使用它们来减少重复或分离问题。日期对象或地址等值对象是此功能的主要用例。

解决方案如下:

/** @Entity */
class Account
{
    /** @Embedded(class = "AccountPeriod") */
    private $accountPeriod;
}

/** @Embeddable */
class AccountPeriod
{
    /** @Column(type="datetime") */
    private periodStart;

    /** @Column(type="datetime") */
    private periodEnd;

    public function doSomething(){...}
}