原则-与实体分离的模型

谢尔盖·波斯基奇(Sergey Poskachey)

这是交易。使用适用于PHP的Doctrine ORM,我需要将模型与实体持久层“分离”。假设我们有UserEntity,其中包含用于数据库映射的所有漂亮内容,例如:批注,属性,setters / getters等。另一方面,我想拥有一个单独的User类,该类仅包含与业务相关的逻辑,例如:User :: getFullName()。此外,我希望User扩展UserEntity,以便User继承所有访问方法。

我检查过的可能解决方案对我不起作用:

  • 只是从实体扩展模型,然后在DQL中指定模型不起作用
  • make UserEntity / ** @MappedSuperclass * /不起作用,因为在这种情况下UserEntity“本身不是实体”
  • InheritanceType / DiscriminatorColumn / DiscriminatorMap不能正常工作,因为模型不是实体

有任何想法吗 ?

谢尔盖·波斯基奇(Sergey Poskachey)

知道了!(> = PHP 5.4解决方案)

简短:将实体作为特征,在模型类中使用实体特征。签出此文档页面:http : //doctrine-orm.readthedocs.org/en/latest/tutorials/override-field-association-mappings-in-subclasses.html

示例:假设我们有用户模型。首先创建用户实体:

/**
 * @ORM\Table(name="user")
 */
trait UserEntity {

     /**
      * @var integer
      *
      * @ORM\Column(name="id", type="integer", nullable=false)
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="IDENTITY")
      */
      protected $id;

     /**
      * @var string
      *
      * @ORM\Column(name="first_name", type="string", length=100, nullable=true)
      */
      protected $firstName;

     /**
      * @var string
      *
      * @ORM\Column(name="last_name", type="string", length=100, nullable=true)
      */
      protected $lastName;

      // other mapping here...
}

然后创建一个模型并在其中使用实体特征:

/**
 * @ORM\Entity
 */
class User {
    use UserEntity;

    public function getFullName() {
        return $this->firstName . ' ' . $this->lastName;
    }
}

在用户模型中注意@Entity批注。为了在实体管理器中直接使用模型,这是必需的。

现在假设我们需要一个扩展用户一的Admin模型。这有点棘手。我们必须将User中的@Entity更改为@MappedSuperclass,以便可以对其进行扩展。然后创建Admin模型,将其声明为@Entity并使用@Table批注在其上重新声明一个表名(否则,由于某些原因,Doctrine将从哪个表中提取混淆)。看起来像这样:

/**
 * @ORM\MappedSuperclass
 */
class User {
    use UserEntity;

    public function getFullName() {
        return $this->firstName . ' ' . $this->lastName;
    }
}

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class Admin extends User {
    public function getFullName() {
        return parent::getFullName() . ' (admin)';
    }
}

这样,用户和管理员模型(=实体)都可以在Doctrine中使用。

而且,我们不能像对待实体那样做通常的事情:通过实体管理器对它们进行查找(),在查询中直接使用模型等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

原则-与实体分离的模型

来自分类Dev

原则与多实体关联

来自分类Dev

选择多个实体原则

来自分类Dev

原则实体代理例外

来自分类Dev

原则:更新整个实体

来自分类Dev

原则实体代理例外

来自分类Dev

原则不加载实体

来自分类Dev

扩展原则实体存储库

来自分类Dev

原则批处理的分离/清除用法

来自分类Dev

原则2加入实体,再加入实体

来自分类Dev

原则,如何离开未生成的实体?

来自分类Dev

原则:用条件计算实体的项目

来自分类Dev

原则2实体列方法名称

来自分类Dev

设置数据透视表的原则实体

来自分类Dev

Symfony原则防止特定实体的记录删除

来自分类Dev

原则2:反向自引用实体

来自分类Dev

原则2实体列方法名称

来自分类Dev

原则:使用注释验证模型数据

来自分类Dev

原则orderBy通过注释。基于关联的实体排序实体关联。

来自分类Dev

原则查询基于相关实体字段搜索实体

来自分类Dev

原则-实体A与相关实体B和C之间的关系

来自分类Dev

原则:如何手动设置实体的MySQL时间戳

来自分类Dev

原则查询构建器获取外部实体的字段

来自分类Dev

原则从实体生成中排除表

来自分类Dev

检查Symfony原则实体是否已从提交表单中更改

来自分类Dev

dql原则,其中带有关联实体的子句解释

来自分类Dev

原则2“在关联上找到了类型的实体,但是是预期的”

来自分类Dev

单一责任原则和实体类别

来自分类Dev

原则批量插入-实体管理器清除