В Doctrine схема не может быть обновлена, пока я добавил новое поле

У меня есть две таблицы: одна - продукт, а другая - категория. Сначала я создал продукт и сгенерировал схему базы данных через терминал. Когда я добавил поле ниже в сущность продукта:

     /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $category;

Затем я добавил поле продукта в сущность категории, как показано ниже:

/**
 * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
 */
protected $products;

public function __construct()
{
    $this->products = new ArrayCollection();
}

Когда я набираю следующую команду в терминале:

php console doctrine:schema:update --force

Там написано, что Nothing to update - your database is already in sync with the current entity metadata.

На последнем этапе я даже удалил таблицы продуктов и категорий и сгенерировал их с помощью следующей команды:

php console doctrine:schema:update --force

И обе таблицы были созданы, но не удалось добавить category_id.

Я следил за официальной книгой Symfony. Есть ли здесь что-то, что я пропустил?

Я добавил category_id с его метаданными вручную после создания объекта через оболочку

ИЗМЕНИТЬ::

Объект продукта:

<?php

namespace Acme\StoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Product
 */
class Product
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $name;

    /**
     * @var string
     */
    private $price;

    /**
     * @var string
     */
    private $description;

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $category;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Product
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set price
     *
     * @param string $price
     * @return Product
     */
    public function setPrice($price)
    {
        $this->price = $price;

        return $this;
    }

    /**
     * Get price
     *
     * @return string 
     */
    public function getPrice()
    {
        return $this->price;
    }

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

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }
}

Объект категории:

<?php

namespace Acme\StoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Category
 */
class Category
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $name;


    /**
     * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
     */
    protected $products;

    public function __construct()
    {
        $this->products = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Category
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
}

person Alireza    schedule 30.04.2014    source источник
comment
Вы пробовали удалить кеш?   -  person    schedule 30.04.2014
comment
Вы пометили оба класса сущностей знаком @ORM\Entity?   -  person sroes    schedule 30.04.2014
comment
Я использовал namespace Acme\StoreBundle\Entity; в обоих классах.   -  person Alireza    schedule 30.04.2014
comment
@phpGeek Пожалуйста, обновите вопрос, указав полный исходный код класса сущности.   -  person    schedule 30.04.2014
comment
@JakubPolák, я тоже пробовал, но безуспешно   -  person Alireza    schedule 30.04.2014
comment
Я думаю, что что-то не так с метаданными, которые консольная команда не может прочитать!   -  person Alireza    schedule 30.04.2014
comment
Используете ли вы yaml для настройки схемы таблиц? Я вижу, что вы не используете annotations для определения других полей (например, id и name). Я не уверен, что вы можете смешивать определение схемы таблицы таким образом.   -  person pazulx    schedule 30.04.2014
comment
Я использовал yml. Все классы сущностей создаются самой Symfony! Я просто добавил внешний ключ category_id.   -  person Alireza    schedule 30.04.2014


Ответы (1)


В вашем файле yml отсутствует правильное сопоставление, ваш файл yml должен содержать что-то вроде этого:

Product:
  type: entity
  manyToOne:
    category:
      targetEntity: Category
      inversedBy: products
      joinColumn:
        name: category_id
        referencedColumnName: id

Подробнее о сопоставлении yaml читайте в сопутствующей документации.

person Community    schedule 30.04.2014
comment
Эти классы были созданы самой Symfony. Кстати, я попробовал ваши метаданные, но ничего не происходит! Я получил такое же сообщение. - person Alireza; 30.04.2014
comment
@phpGeek Используете ли вы аннотации, yml или xml для настройки сущностей? - person ; 30.04.2014
comment
@phpGeek Вы могли выбрать это, когда создавали сущности через консоль. - person ; 30.04.2014
comment
Я выбрал ЮМЛ. Как так? Это связано? - person Alireza; 30.04.2014
comment
@phpGeek Да, если вы выберете yml, вы не сможете настроить классы с помощью таких аннотаций @ORM\ManyToOne(targetEntity="Category", inversedBy="products"), но вам нужно сделать это в файле yml. Лично я предпочитаю аннотации xml или yml. - person ; 30.04.2014