@ORM\Id 不会为 symfony 中的实体创建标识符

Posted

技术标签:

【中文标题】@ORM\\Id 不会为 symfony 中的实体创建标识符【英文标题】:@ORM\Id does not make an identifier for an entity in symfony@ORM\Id 不会为 symfony 中的实体创建标识符 【发布时间】:2017-05-26 09:41:53 【问题描述】:

我有一个由许多特征组成的类 City。

/**
 * @ORM\Entity
 * @ORM\Table(name="City")
 * @SoftDeleteable(fieldName="deletedAt")
 */
class City

    use IdentifiableEntity;
    use TimestampableEntity;    

我有一个特征 IdentifiableEntity

trait IdentifiableEntity

    /**
     * @var integer
     * @ORM\Column(name="id", type="integer", options="unsigned":true)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    //setter getter

当我执行 bin/console dictionary:migrations:diff 时出现问题我收到此错误消息

[Doctrine\ORM\Mapping\MappingException]                                                                                         
  No identifier/primary key specified for Entity "AppBundle\Entity\City\City". Every Entity must have an identifier/primary key. 

这是为什么呢?我已经在我的特质中明确指出 $id 应该像 @ORM\Id 一样对待。添加@ORM\GeneratedValue(strategy="IDENTITY") 也无济于事。怎么了?

附:我正在使用 symfony 3.2 和教义/doctrine-migrations-bundle: 1.0

【问题讨论】:

您是否有可能拥有另一个实体,其关联指向此“城市”实体,该实体指向错误的命名空间?? (AppBundle\Entity\City\City) @SamJanssens,没错,但它是指向该实体的正确命名空间。 似乎不可能在特征内部创建主键。奇怪的是,我很难找到有关它的任何信息 我假设你已经使用 Doctrine\ORM\Mapping 作为 ORM;在你的特质实体中? @Doug 是的,当然。 【参考方案1】:

只有当你的类 City 有其他没有注释的 $id 属性时才有可能。所以它会从 trait 中覆盖 $id。 否则,请确保这是确切的 City 类,而不是来自另一个命名空间的其他类。

【讨论】:

不太确定我理解了第二部分,所以我再次问:你说我每次都必须从一个特征中覆盖一个 $id 才能使其工作? 他的意思是你的 City 实体必须有一个 $id 属性,这个 $id 属性将被你的 trait 覆盖。如果您的 trait 的唯一目的是将 $id 属性作为所有实体的主键,则应避免使用它 我的意思是,如果您要从 trait 中准确获取 id,请确保您在 City 类中没有 id。因为来自 City 类的 id 将优先于教义而不是 trait。 @ArturYukhatov 除了来自 trait 的 id 之外,我没有其他 id。所以我认为教义不可能将特征主键用作使用特征的实体的主键。 @OlivierC 这很糟糕,拥有一个为使用它的实体设置主键的特征看起来不错

以上是关于@ORM\Id 不会为 symfony 中的实体创建标识符的主要内容,如果未能解决你的问题,请参考以下文章

使用 docrine 模式在 symfony 中的另一列之后添加新列

使用 YAML 的 Doctrine2 和 Symfony2 的默认列值?

Symfony学说OneToAll关系

JMS 反序列化不适用于排除策略

更改后,Symfony 实体不会在数据库中更新

如何在奏鸣曲中保存一对多关系?