不创建继承属性的理论架构


doctrine schema not creating inherited properties

我有两个类,AbstractProject和Project。AbstractProject 是一个抽象类,由 Project 扩展。当我运行 doctrine:schema:validate 时,它说我的模式很好,即使我的项目表只有一个 Id 字段。一切正常,直到几天前我浏览并重命名了一些类,但现在我似乎无法获得为继承属性生成数据库列的原则。我的 twig 模板毫无怨言地访问属性(它们显示为空白,但不抱怨属性或方法不存在),我可以在父类中使用继承的属性,但 doctrine 拒绝识别它们。下面的类和映射,欣赏另一双眼睛,也许我错过了一些简单的东西。

*如果有帮助,当我尝试为 dpProjectBundle(AbstractProject 所在的位置)生成实体时,我收到一个错误:"捆绑包"dpProjectBundle"不包含任何映射实体。我不确定它是否应该将映射的超类视为映射的实体,但也许这是问题的迹象?

*在粘贴代码时,我注意到我在项目类中缺少"使用 Doctrine''ORM''Mapping as ORM;",添加该行后仍然说我的模式有效,但也许这是一个问题?我还尝试清除缓存,以及 doctrine:cache:clear-metadata 命令

解决*在我的config.yml中,我使用了多个实体管理器,并且我还没有将dpProjectBundle(AbstractProject)与实体管理器相关联。一旦我做了这个原则,我就意识到我的架构是无效的,当我运行更新时,我的列现在存在。

orm:
    default_entity_manager: dp
    entity_managers:
        dp:
            connection: dp
            mappings:
                dpProjectBundle: ~ // <-- this line was missing, and caused my problems
                devUserBundle: ~
                devSecurityBundle: ~
                devProjectBundle: ~
                devWebsiteBundle: ~
        local:
            connection: local
            mappings:

项目:

namespace dev'ProjectBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
use dp'ProjectBundle'Entity'AbstractProject;
/**
 * Project
 */
class Project extends AbstractProject
{
    /**
     * @var integer
     */
    protected $id;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * @var 'Doctrine'Common'Collections'Collection
     */
    protected $tasks;
    /**
     * Constructor
     */
    public function __construct()
    {
        parent::__construct();
        $this->tasks = new 'Doctrine'Common'Collections'ArrayCollection();
    }
    /**
     * Add tasks
     *
     * @param 'dev'ProjectBundle'Entity'Task $tasks
     * @return Project
     */
    public function addTask('dev'ProjectBundle'Entity'Task $tasks)
    {
        $this->tasks[] = $tasks;
        return $this;
    }
    /**
     * Remove tasks
     *
     * @param 'dev'ProjectBundle'Entity'Task $tasks
     */
    public function removeTask('dev'ProjectBundle'Entity'Task $tasks)
    {
        $this->tasks->removeElement($tasks);
    }
    /**
     * Get tasks
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getTasks()
    {
        return $this->tasks;
    }
}

摘要项目:

namespace dp'ProjectBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * AbstractProject
 */
abstract class AbstractProject
{
    public function __construct()
    {
        $this->createdAt = new 'DateTime();
    }
    /**
     * @var string
     */
    protected $name;
    /**
     * @var 'DateTime
     */
    protected $createdAt;
    /**
     * @var 'DateTime
     */
    protected $completedAt;

    /**
     * Set name
     *
     * @param string $name
     * @return AbstractProject
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }
    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Set createdAt
     *
     * @param 'DateTime $createdAt
     * @return AbstractProject
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;
        return $this;
    }
    /**
     * Get createdAt
     *
     * @return 'DateTime 
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }
    /**
     * Set completedAt
     *
     * @param 'DateTime $completedAt
     * @return AbstractProject
     */
    public function setCompletedAt($completedAt)
    {
        $this->completedAt = $completedAt;
        return $this;
    }
    /**
     * Get completedAt
     *
     * @return 'DateTime 
     */
    public function getCompletedAt()
    {
        return $this->completedAt;
    }
    /**
     * @var string
     */
    protected $description;

    /**
     * Set description
     *
     * @param string $description
     * @return AbstractProject
     */
    public function setDescription($description)
    {
        $this->description = $description;
        return $this;
    }
    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }
}

项目映射:

dev'ProjectBundle'Entity'Project:
    type: entity
    table: dev_projects
    oneToMany:
        tasks:
            targetEntity: Task
            mappedBy: project
            cascade: [persist, remove]
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
    lifecycleCallbacks: {  }

抽象项目映射:

dp'ProjectBundle'Entity'AbstractProject:
    type: mappedSuperclass
    fields:
        name:
            type: string
            length: 255
        description:
            type: text
            nullable: true
        createdAt:
            type: datetime
        completedAt:
            type: datetime
            nullable: true
    lifecycleCallbacks: {  }

在我的config.yml中,我使用了多个实体管理器,并且我还没有将dpProjectBundle(AbstractProject)与实体管理器相关联。一旦我做了这个原则,我就意识到我的架构是无效的,当我运行更新时,我的列现在存在。