如何在Symfony2中扩展实体,就像以前在Symfony 1中一样?

时间:2011-12-09 10:44:42

标签: symfony symfony1 doctrine doctrine-orm

在旧版本的Symfony中,您曾经能够通过扩展具有扩展子类的模型类来在数据对象中构建新对象。

例如,我有一个包含结果表的问卷模型。结果表有一个Result.php模型类,用于通过Doctrine设置和获取结果。然后,我使用ResultPeer.php模型子类向Result对象添加一个新函数,该函数获取结果,并根据计算得分和相应颜色的一组固定阈值。

在使用Doctrine2的新Symfony2版本中,我正在努力找到最好的方法来实现这一目标。在创建实体时,我只能在文档中找到基于数据结构关系添加对象的能力。

我查看了实体存储库,但这似乎并没有扩展或添加原始对象的功能。它似乎基于比标准查询函数更复杂的查询来恢复数据对象。

我还查看了服务,我可以使用它来收集对象,然后使用该对象创建一个包含此对象和新创建的数据的新数组,但这似乎不正确或遵循Symfony的理念所有关于。

有谁知道如何将函数添加到现有数据对象。我发现它在旧版本的Symfony中非常有用,但似乎无法在新版本的Symfony2中找到替代方案。

1 个答案:

答案 0 :(得分:18)

扩展实体是最佳选择。在Doctrine2世界中,他们讨论了继承映射。这是一个代码示例。它定义了BaseEntity,然后将其扩展为创建BaseAuditableEntity,最后有一个User实体扩展BaseAuditableEntity。诀窍是使用@Orm\MappedSuperclass注释。即使我的关系图中有三个实体,此继承方案也将创建一个表。然后,这将所有属性合并到一个表中。创建的表将包含通过关系映射的每个属性,即来自BaseAuditableEntity和User的属性。这里是代码示例:

Acme\WebsiteBundle\Entity\BaseEntity.php

namespace Acme\WebsiteBundle\Entity;

use Doctrine\ORM\Mapping as Orm;

/**
 * @Orm\MappedSuperclass
 */
class BaseEntity {

}

Acme\WebsiteBundle\Entity\BaseAuditableEntity.php

namespace Acme\WebsiteBundle\Entity;

use Doctrine\ORM\Mapping as Orm;

/**
 * @Orm\MappedSuperclass
 */
class BaseAuditableEntity extends BaseEntity {

    private $createdBy;

    /**
     * @Orm\Column(type="datetime", name="created_at")
     */
    private $createdAt;

    /**
     * @Orm\ManyToOne(targetEntity="User")
     * @Orm\JoinColumn(name="updated_by", referencedColumnName="id")
     */
    private $updatedBy;

    /**
     * @Orm\Column(type="datetime", name="updated_at")
     */
    private $updatedAt;

    // Setters and getters here
}

Acme\WebsiteBundle\Entity\User.php

namespace Acme\WebsiteBundle\Entity;

use Acme\WebsiteBundle\Entity\BaseAuditableEntity;

use Doctrine\ORM\Mapping as Orm;

/**
 * @Orm\Entity(repositoryClass="Acme\WebsiteBundle\Entity\Repository\UserRepository")
 * @Orm\Table(name="acme_user")
 */
class User extends BaseAuditableEntity implements AdvancedUserInterface, \Serializable
{
    /**
     * @Orm\Id
     * @Orm\Column(type="integer")
     * @Orm\GeneratedValue
     */
    private $id;

    /**
     * @Orm\Column(type="string", name="first_name")
     */
    private $firstName;

    /**
     * @Orm\Column(type="string", name="last_name")
     */
    private $lastName;

    /**
     * @Orm\Column(type="string", unique="true")
     */
    private $email;

    // Other properties

    // Constructor

    // Setters and getters
}

这是指向Doctrine 2.1的官方继承映射文档的链接:here

希望这有帮助,如果您需要更多信息,请随时发表评论。

的问候,
马特