【问题标题】:Can Doctrine2 map an object property to the entities' table?Doctrine2 可以将对象属性映射到实体表吗?
【发布时间】:2014-09-24 23:40:13
【问题描述】:

我将 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 列。我搜索了它,但找不到任何东西 - 我还查看了自定义类型,但据我所知,它们只映射简单类型而不是聚合。

我还想在查询中使用这些列,因此不能选择“object”原则列类型。

以前有人做过吗,也许有一些技巧? 还是说 Doctrine2 是不可能的?

【问题讨论】:

    标签: php orm doctrine-orm datamapper


    【解决方案1】:

    以上案例的答案是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(){...}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2015-12-07
      • 2017-03-16
      相关资源
      最近更新 更多