这是交易.
使用Doctrine ORM for PHP,我需要将模型与实体持久层“解耦”.
假设我们有UserEntity,其中包含db映射的所有漂亮内容,
as:注释,属性,setter / getters等.
另一方面,我想要一个单独的User类,它只保存与业务相关的逻辑,例如:User :: getFullName().
此外,我希望用户扩展UserEntity,以便用户继承所有访问方法.
我检查过的可能解决方案对我不起作用:
>只是从实体扩展模型然后在DQL中指定模型不起作用
> make UserEntity / ** @MappedSuperclass * /不起作用,因为在这种情况下,UserEntity“本身并不是一个实体”
> InheritanceType / DiscriminatorColumn / DiscriminatorMap不起作用,因为模型不是实体
有任何想法吗 ?
解决方法:
得了! (> = PHP 5.4解决方案)
例:
假设我们有用户模型.首先创建用户实体:
/**
* @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注释.这是直接使用模型所必需的
在实体经理.
现在假设我们需要一个扩展User one的Admin模型.这有点棘手.
我们必须将@Entity更改为User中的@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中使用.
我们不能做任何我们通常对实体做的事情:
通过实体管理器查找()它们,直接在查询中使用模型等.
标签:php,orm,doctrine-orm
来源: https://codeday.me/bug/20190628/1320178.html