@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 中的另一列之后添加新列