复合标识符,但使用除手动分配+ Symfony2之外的ID生成器

nie*_*lsv 14 php mysql sql symfony doctrine-orm

我有三张桌子.

item 与领域

    PK id
    title
    description
    type
    created
    delete
    fk user_id
Run Code Online (Sandbox Code Playgroud)

article 与领域

    PK item_id (one-to-one with item table), 
    body
Run Code Online (Sandbox Code Playgroud)

media 与领域

    PK id
    FK item_id (many-to-one with item table)
    url
    type
    mimetype
    isexternal
Run Code Online (Sandbox Code Playgroud)

表中的type字段article是带有值的ENUM 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.
Run Code Online (Sandbox Code Playgroud)

更新:
删除我的类型变量并修复discriminatormap后,我收到此错误:

Property Beachteam\BeachteamBundle\Entity\Item::$type does not exist
Run Code Online (Sandbox Code Playgroud)

这是我更新的物品实体:

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我更新的文章实体:

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释我的错误(互联网并没有帮助我多少)..为什么我会得到这个错误?

PS:我使用的是Symfony 2.4.1和PHP 5.4.20

Jas*_*wer 5

我想这一行(in Item):

/**
 * @ORM\DiscriminatorMap({"ITEM"="Item", "ARTICLE"="Article" "IMAGE"="Media"})
 */
Run Code Online (Sandbox Code Playgroud)

应该:

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

我不太确定,但可能是鉴别器映射需要完全限定的类名:

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

接下来,你将需要删除的属性$typeItem,因为type已经被用于鉴别列.

您可能还想使用控制台来验证映射:

app/console doctrine:schema:validate
Run Code Online (Sandbox Code Playgroud)

修复可能报告的所有错误.

更新

物业Beachteam\BeachteamBundle\Entity\Item :: $ type不存在

这意味着,在某个地方的代码(现在不存在的)财产$type类的Item仍在使用.你必须追踪到哪里.

  • 搜索您的代码->type.
  • 清除缓存(删除app/cache文件夹的内容并运行app/console cache:clear.