gpt4 book ai didi

symfony - 使用 Doctrine2 扩展 Symfony2 中的实体

转载 作者:行者123 更新时间:2023-12-02 14:44:32 27 4
gpt4 key购买 nike

我无法找到一种方法来使用 Doctrine2 作为 ORM 在 Symfony2 中跨 bundle 适当扩展实体。

目前我发现了三种使用 Doctrine2 作为 ORM 来扩展 Symfony2 中的实体的方法。 映射父类(super class)单表继承类表继承。这些都不适合我想要做的事情。

我有两个 Bundle:UserBundle 和 BlogBu​​ndle。我希望能够在没有 BlogBu​​ndle 的项目中使用 UserBundle,但 BlogBu​​ndle 将始终在具有 User Bundle 的项目中使用。如果 BlogBu​​ndle 依赖于 UserBundle 也没关系,但反之则不然。

我有两个实体:BlogBu​​ndle\Entity\Post 和UserBundle\Entity\User

关系:用户和博客文章之间需要存在一对多的关系。这是通过 BlogBu​​ndle\Entity\Post 对象(表)上的 Author_ID 属性(列)实现的,该属性映射到 UserBundle\Entity\User.id

问题:我可以直接从 BlogBu​​ndle 中调用 UserBundle\Entity\User 实体,并使用单向映射实现我正在寻找的内容。这不允许我从用户对象中访问用户的所有帖子。我可以通过自定义查询访问数据,但这并不像通过用户对象访问用户的帖子那么干净。

我想要做的是从 BlogBu​​ndle 中扩展 UserBundle\Entity\User 对象,并将方法和属性添加到该对象,以建立 BlogBu​​ndle 中使用的一对多映射。这些都不是持久的,它只是定义了关系,并允许我通过向博客包中的 User 对象添加所需的功能来逻辑地访问用户在实现 BlogBu​​ndle 和 UserBundle 的应用程序中创建的所有帖子(从而避免依赖关系)从 UserBundle 到 BlogBu​​ndle)。

当我创建 BlogBu​​ndle\Entity\User 对象并扩展 UserBundle\Entity\User 时,我必须声明 @ORM\Table(name="usertablename")。如果不这样做,任何访问 BlogBu​​ndle\Entity\User 对象的尝试都将无法访问数据库。由于扩展对象中的任何添加都不会持久,因此这可以在 bundle 中正常工作。问题是,当我调用“php app/consoledoctrine:schema:update --force”时,会发生冲突,因为两个实体尝试映射到并创建相同的表。我尝试过使用最近实现的 ResolveTargetEntityListener 功能,但这与 Mapped Superclas、STI 和 CTI 一起强制从 UserBundle 依赖 BlogBu​​ndle。

以下是我的对象,可帮助说明我的设置。为了清楚起见,它们已被缩写。我意识到某些语义不正确,但它旨在传达想法和配置。

UserBundle\Entity\User

@ORM\Table(name="app_user")
@ORM\Entity
class User implements UserInterface
{
...
}

BlogBu​​ndle\Entity\Post

@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;
}

BlogBu​​ndle\Entity\User

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 */
}

这可行,但问题是我将项目中的两个实体映射到同一个表。扩展对象不会从其父对象获取 @ORM\Table(name="app_user"),因此必须在 BlogBu​​ndle\Entity\User 中定义它。否则, Controller 对此对象的任何引用都将无法访问数据库。由于扩展对象中没有保留任何内容,因此除了当我尝试从控制台更新数据库架构时之外,没有任何内容被破坏。

我可以使用单向关系,但这限制了我从 Controller 内访问数据的方式。

最佳答案

您可以在这个链接中查看有关继承的知识: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
{
...
}

和 BlogBu​​ndle\Entity\User

use App\UserBundle\Entity\User as BaseUser;
/**
* @ORM\Entity
*/
class User extends BaseUser
{
....
}

祝你好运!

关于symfony - 使用 Doctrine2 扩展 Symfony2 中的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12802458/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com