составной идентификатор, но использует генератор идентификаторов, отличный от ручного назначения + Symfony2


У меня есть три таблицы.

item с полями

    PK id
    title
    description
    type
    created
    delete
    fk user_id

article с полями

    PK item_id (one-to-one with item table), 
    body

media с полями

    PK id
    FK item_id (many-to-one with item table)
    url
    type
    mimetype
    isexternal

Поле type в таблице article представляет собой ПЕРЕЧИСЛЕНИЕ со значениями ITEM, ARTICLE and IMAGE.
Сущности создаются автоматически. Таким образом, изначально сущность Статьи не расширяет сущность элемента. Я должен был это изменить.

Я всегда получаю эту ошибку:

Entity 'Beachteam\BeachteamBundle\Entity\Article' has a composite identifier 
but uses an ID generator other than manually assigning (Identity, Sequence). 
This is not supported.

ОБНОВЛЕНИЕ:
После удаления моей переменной типа и исправления дискриминатормап Я получаю эту ошибку:

Property Beachteam\BeachteamBundle\Entity\Item::$type does not exist

Это моя обновленная сущность элемента:

<?php

namespace Beachteam\BeachteamBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Item
 *
 * @ORM\Table(name="item", indexes={@ORM\Index(name="fk_item_user1_idx", columns={"user_id"})})
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *     "ITEM"="Beachteam\BeachteamBundle\Entity\Item",
 *     "ARTICLE"="Beachteam\BeachteamBundle\Entity\Article",
 *     "IMAGE"="Beachteam\BeachteamBundle\Entity\Media"
 * })
 */
class Item
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text", nullable=true)
     */
    private $description;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="created", type="datetime", nullable=false)
     */
    private $created;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="deleted", type="datetime", nullable=true)
     */
    private $deleted;

    /**
     * @var \Beachteam\BeachteamBundle\Entity\User
     *
     * @ORM\ManyToOne(targetEntity="Beachteam\BeachteamBundle\Entity\User")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     * })
     */
    private $user;

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

    /**
     * Set title
     *
     * @param string $title
     * @return Item
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

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

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

        return $this;
    }

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

    /**
     * Set created
     *
     * @param \DateTime $created
     * @return Item
     */
    public function setCreated($created)
    {
        $this->created = $created;

        return $this;
    }

    /**
     * Get created
     *
     * @return \DateTime 
     */
    public function getCreated()
    {
        return $this->created;
    }

    /**
     * Set deleted
     *
     * @param \DateTime $deleted
     * @return Item
     */
    public function setDeleted($deleted)
    {
        $this->deleted = $deleted;

        return $this;
    }

    /**
     * Get deleted
     *
     * @return \DateTime 
     */
    public function getDeleted()
    {
        return $this->deleted;
    }

    /**
     * Set user
     *
     * @param \Beachteam\BeachteamBundle\Entity\User $user
     * @return Item
     */
    public function setUser(User $user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \Beachteam\BeachteamBundle\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }
}

Это моя обновленная сущность статьи:

<?php

namespace Beachteam\BeachteamBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Item
 *
 * @ORM\Table(name="article")
 * @ORM\Entity
 */
class Article extends Item
{
    /**
     * @var string
     *
     * @ORM\Column(name="body", type="text")
     */
    protected $body;

    /**
     * Set body
     *
     * @param string $body
     * @return Article
     */
    public function setBody($body)
    {
        $this->body = $body;

        return $this;
    }

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

Может ли кто-нибудь объяснить мне ошибку (Интернет мне не очень помог).. И почему я получаю эту ошибку?

P.S.: Я использую Symfony 2.4.1 и PHP 5.4.20

Author: nielsv, 2014-02-18

2 answers

Я думаю, что эта строка (в Item):

/**
 * @ORM\DiscriminatorMap({"ITEM"="Item", "ARTICLE"="Article" "IMAGE"="Media"})
 */

Должно быть:

/**
 * @ORM\DiscriminatorMap({"ITEM"="Item", "ARTICLE"="Article", "IMAGE"="Media"})
 *                                                          ^
 */

Я не совсем уверен, но может быть, что карте дискриминатора нужны полные имена классов:

/**
 * @ORM\DiscriminatorMap({
 *     "ITEM"="Beachteam\BeachteamBundle\Entity\Item",
 *     "ARTICLE"="Beachteam\BeachteamBundle\Entity\Article",
 *     "IMAGE"="Beachteam\BeachteamBundle\Entity\Media"
 * })
 */

Далее вам нужно будет удалить свойство $type из Item, потому что type уже используется в качестве столбца дискриминатора.

Вы также можете использовать консоль для проверки ваших сопоставлений:

app/console doctrine:schema:validate

Исправьте все ошибки, которые могут быть сообщается.

Обновление

Свойство Beachteam\Beachteambundle\Сущность\Элемент::$тип не существует

Это означает, что где-то в коде все еще используется (ныне несуществующее) свойство $type класса Item. Вам придется отследить, где.

  • Найдите в своем коде ->type.
  • Очистите кэш (удалите содержимое папки app/cache и запустите app/console cache:clear.
 5
Author: Jasper N. Brouwer, 2014-02-24 18:56:44

Я думаю, что вы планировали атрибут Item::$type при создании доктрины в качестве атрибута наследования. Но это также создается аннотацией:

@ORM\DiscriminatorColumn(name="type", type="string")

У вас есть часть ключа таблицы и поле с тем же именем. Попробуйте удалить атрибут класса (и метод получения, метод установки), затем обновите схему

php app/console doctrine:schema:update --force

После этого изменения ваши классы работают как заклинание на моей коробке

Удачи!

 1
Author: WebHQ, 2014-02-20 22:41:24