我的任务是(或很简单):有各种各样但有限类型的“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
时,这个问题从未发生过
答案 0 :(得分:2)
根据Doctrine's documentation,有3种扩展课程的方法:
您要么是单表继承,要么是类表继承。
映射的超类不起作用,因为您希望父类Post
是独立实体。在这种情况下,Post
类不应将其定义为abstract
。
除非您有大量额外字段,否则您应该使用single table inheritance
。