Doctrined使用Extends

时间:2015-05-13 01:21:21

标签: php mysql symfony doctrine-orm

我的任务是(或很简单):有各种各样但有限类型的“Post”,每种都有一组完全不同的属性,而所有属性都共享一些核心属性(如:Title,Content,Published等)

我打算做的是创建一个具有所有共享属性的基础Post实体(如上所述),并将此实体作为“州长”实体的一种,但更多的是在第二。所有不同的Category实体都将延伸到此基本Post实体之外。

我这样做主要是为了吸引Symfony Form API的优势。每种不同的类别类型都有太多的字段,以保证不会做一些自动化的事情。使用Form API,我可以让Symfony使用Doctrine自动在页面上创建可编辑字段,并在编辑时使用获取的值填充每个字段(如果未填充或新填充,则填充空白),而不必单独以HTML格式提供。

当我说“州长”时,我的意思是我也希望基本帖子拥有它自己的存储库,理想情况下没有相关的表格。此存储库可用于执行某些与Post Type无关的任务,例如findAll()覆盖,它将查询每个类别存储库并将结果合并为一个结果(例如)

理想情况下,我只想在一个位置(实体)中定义每个类别的唯一属性,它将反映在整个网站上。而不是在实体中定义它,编辑表格,前端,表格字段等。

问题

似乎搞乱了我没有覆盖的内置查询。

考虑(请注意粗体文字):

  

执行'SELECT t1.id AS id2,t1.title时发生异常   AS title3,t1.slug AS slug4,t1.date_added AS date_added5,   t1.date_updated AS date_updated6,t1.content AS content7,t1.published   AS已发布8,t1.uid AS uid9, [敏感领域已删除] FROM   PostCategoryTest t1 WHERE t0.id =?' with params [“1”]:

     

SQLSTATE [42S22]:找不到列:1054未知列't0.id'   'where clause'

这是在我拨打基本$this->getDoctrine()->getRepository(PostCategoryTest::DoctrinePath)->find(1)

时引起的

来源

CommonBundle /实体/ post.php中

<?php

namespace CommonBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Post
 *
 * @ORM\Entity(repositoryClass="CommonBundle\Entity\PostRepository")
 */
abstract class Post
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255)
     */
    protected $title;

    /**
     * @var string
     *
     * @ORM\Column(name="slug", type="string", length=255)
     */
    protected $slug;

    //... and so on and so fourth
}

CommonBundle /实体/ PostCategoryTest.php

<?php

namespace CommonBundle\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * Post
 *
 * @ORM\Table(options={"comment":"Post subclass"})
 * @ORM\Entity(repositoryClass="CommonBundle\Entity\PostCategoryTestRepository")
 */
class PostCategoryTest extends Post
{
    const DoctrinePath = "CommonBundle:PostCategoryTest";

    // ... all sensitive information redacted, sorry
    // setup just like a standard entity however, nothing special 
}

我知道还有很多方法可以实现这一目标,我可以继续这样做,因为这会带来比我预期的更多的麻烦。但是为了教育,我想了解为什么Doctrine正是这样做的。当extends来自FOSUserBundle

BaseUser时,这个问题从未发生过

1 个答案:

答案 0 :(得分:2)

根据Doctrine's documentation,有3种扩展课程的方法:

您要么是单表继承,要么是类表继承。

映射的超类不起作用,因为您希望父类Post是独立实体。在这种情况下,Post类不应将其定义为abstract

除非您有大量额外字段,否则您应该使用single table inheritance