这是交易。使用适用于PHP的Doctrine ORM,我需要将模型与实体持久层“分离”。假设我们有UserEntity,其中包含用于数据库映射的所有漂亮内容,例如:批注,属性,setters / getters等。另一方面,我想拥有一个单独的User类,该类仅包含与业务相关的逻辑,例如:User :: getFullName()。此外,我希望User扩展UserEntity,以便User继承所有访问方法。
我检查过的可能解决方案对我不起作用:
有任何想法吗 ?
知道了!(> = 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] 删除。
我来说两句