Jga*_*rib 13 entities extending symfony doctrine-orm
我很难找到一种方法来使用Doctrine2作为ORM在Symfony2中的bundle中适当地扩展实体.
目前,我发现有三种方法可以使用Doctrine2作为ORM在Symfony2中扩展实体.Mapped Superclass,Single Table Inheritance和Class Table Inheritance.这些都不适用于我想要做的事情.
我有两个Bundle:UserBundle和BlogBundle.我希望能够在没有BlogBundle的项目中使用UserBundle,但BlogBundle将始终用于具有User Bundle的项目中.如果BlogBundle依赖于UserBundle,那就没问题,但不是相反.
我有两个实体: BlogBundle\Entity\Post和UserBundle\Entity\User
关系: 用户和博客帖子之间需要有一对多的关系.这是通过BlogBundle\Entity\Post对象(表)上的Author_ID属性(列)实现的,该对象映射到UserBundle\Entity\User.id
问题: 我可以直接从BlogBundle中调用UserBundle\Entity\User实体,并使用Uni-Directional映射实现我正在寻找的东西.这不允许我从User对象中访问用户的所有帖子.我可以通过自定义查询访问数据,但这不像用户通过用户对象访问帖子那样干净.
我想要做的是从BlogBundle中扩展UserBundle\Entity\User对象,并将方法和属性添加到此对象,以建立BlogBundle中使用的一对多映射.这些都没有持久化,它只是定义了关系,并允许我逻辑上访问用户在实现BlogBundle和UserBundle的应用程序中创建的所有帖子,方法是向博客包中的User对象添加所需的功能(从而避免依赖从UserBundle到BlogBundle).
当我创建BlogBundle\Entity\User对象并扩展UserBundle\Entity\User时,我必须声明@ORM\Table(name ="usertablename").如果不这样做,任何访问BlogBundle\Entity\User对象的尝试都将无法访问数据库.由于扩展对象中没有任何添加内容持续存在,因此在捆绑包中可以正常工作.这个问题是当我调用"php app/console doctrine:schema:update --force"时,由于两个实体试图映射到&创建同一个表,因此存在冲突.我已经尝试使用最近实现的ResolveTargetEntityListener功能,但这与Mapped Superclas,STI和CTI一起强制从UserBundle强制依赖BlogBundle.
以下是我的目标,以帮助说明我的设置.它们的缩写是为了清楚起见.我意识到一些语义不正确,但它的目的是传达思想和配置.
UserBundle \实体\用户
@ORM\Table(name="app_user")
@ORM\Entity
class User implements UserInterface
{
...
}
Run Code Online (Sandbox Code Playgroud)
BlogBundle \实体\帖子
@ORM\Table(name="app_post")
@ORM\Entity
class Post
{
...
@ORM\Column(name="author_id", type="integer")
protected $author_id;
@ORM\ManyToOne(targetEntity="\App\BlogBundle\Entity\User", inversedBy="posts")
@ORM\JoinColumn(name="author_id", referencedColumnName="id")
protected $author;
}
Run Code Online (Sandbox Code Playgroud)
BlogBundle \实体\用户
use App\UserBundle\Entity\User as BaseUser
@ORM\Entity
@ORM\table(name="app_user")
class User extends BaseUser
{
....
@ORM\OneToMany(targetEntity="App\BlogBundle\Entity\Post", mappedBy="author")
protected $posts;
public function __construct()
{
parent::_construct();
$this->posts = new \Doctrine\Common\Collections\ArrayCollection();
}
....
/* Getters & Setters, nothing that defines @ORM\Column, nothing persisted */
}
Run Code Online (Sandbox Code Playgroud)
这有效,但问题是我将项目中的两个实体映射到同一个表.扩展对象不从它的父级获取@ORM\Table(name ="app_user"),因此必须在BlogBundle\Entity\User中定义它.如果没有来自控制器的任何对此对象的引用将不访问数据库.由于扩展对象没有任何内容,除了我尝试从控制台更新数据库模式时,没有任何内容被破坏.
我可以使用单向关系,但这限制了我如何从控制器中访问数据.
小智 7
你可以在这个链接中看到有关继承的知识:http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html#single-table-inheritance
您必须在UserBundle\Entity\User中声明:
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"baseuser" = "UserBundle\Entity\User", "blogUser" = "BlogBundle\Entity\User"})
*/
class User implements UserInterface
{
...
}
Run Code Online (Sandbox Code Playgroud)
和BlogBundle\Entity\User
use App\UserBundle\Entity\User as BaseUser;
/**
* @ORM\Entity
*/
class User extends BaseUser
{
....
}
Run Code Online (Sandbox Code Playgroud)
祝好运!
| 归档时间: |
|
| 查看次数: |
16197 次 |
| 最近记录: |