схема доктрины не создает унаследованные свойства

0

У меня есть два класса: AbstractProject и Project. AbstractProject - абстрактный класс и расширен проектом. Когда я запускаю doctrine: schema: validate, он говорит, что моя схема в порядке, хотя моя таблица Project имеет только поле Id. Все работало нормально, пока пару дней назад я не перешел на несколько классов, но теперь я не могу заставить доктрину генерировать столбцы базы данных для унаследованных свойств. Мои шаблоны ветки доступа к свойствам без жалоб (они выглядят пустым, но не жалуются на свойство или метод, которые не существуют), и я могу использовать унаследованные свойства в родительском классе, но доктрина отказывается их распознавать. Классы и отображения ниже, оцените еще один взгляд на него, может быть, я пропустил что-то простое.

* Если это помогает, когда я пытаюсь сгенерировать сущности для dpProjectBundle (где живет AbstractProject), я получаю сообщение об ошибке: "Bundle" dpProjectBundle "не содержит сопоставленных объектов". Я не уверен, что он должен рассматривать сопоставленныеSuperclasses как отображаемые объекты, но, может быть, это признак проблемы?

* при вставке кода я заметил, что мне не хватает "использовать Doctrine\ORM\Mapping как ORM"; в классе Project, по-прежнему говорит, что моя схема действительна после добавления этой строки, но, возможно, это была проблема? Я также попытался очистить кеш, а команда doctrine: cache: clear-metadata

RESOLVED * В моем 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;
    }
}

AbstractProject:

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: {  }

AbstractProject Mapping:

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: {  }
  • 0
    Не связывайте код, вставьте его напрямую. Вставьте две ваши сущности: у меня есть идея
  • 0
    включил занятия в пост, спасибо за обзор
Показать ещё 2 комментария
Теги:
orm
doctrine

1 ответ

0
Лучший ответ

В моем config.yml я использую несколько менеджеров сущностей, и я еще не связал dpProjectBundle (AbstractProject) с менеджером сущностей. Как только я сделал это доктрину, понял, что моя схема недействительна, и когда я запустил обновление, теперь мои столбцы присутствуют.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню