составной идентификатор, но использует генератор идентификаторов, отличный от ручного назначения + 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
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
.
Я думаю, что вы планировали атрибут Item::$type при создании доктрины в качестве атрибута наследования. Но это также создается аннотацией:
@ORM\DiscriminatorColumn(name="type", type="string")
У вас есть часть ключа таблицы и поле с тем же именем. Попробуйте удалить атрибут класса (и метод получения, метод установки), затем обновите схему
php app/console doctrine:schema:update --force
После этого изменения ваши классы работают как заклинание на моей коробке
Удачи!