@ORM\Id не делает идентификатор сущности в symfony

У меня есть класс Город, который состоит из ряда черт.

/**
 * @ORM\Entity
 * @ORM\Table(name="City")
 * @SoftDeleteable(fieldName="deletedAt")
 */
class City
{
    use IdentifiableEntity;
    use TimestampableEntity;    
}

У меня есть черта IdentifiedEntity

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 doctrine: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") тоже не помогает. Что не так?

P.S. Я использую symfony 3.2 и пакет доктрины/доктрины-миграции: 1.0.


person hvertous    schedule 26.05.2017    source источник
comment
есть ли шанс, что у вас есть другой объект с ассоциацией, указывающей на этот объект «Город», который указывает на неправильное пространство имен ?? (AppBundle\Entity\City\City) ‹- двойной город   -  person Sam Janssens    schedule 26.05.2017
comment
@SamJanssens, точно, но это правильное пространство имен, указывающее на эту сущность.   -  person hvertous    schedule 26.05.2017
comment
кажется, что невозможно сделать первичный ключ внутри трейта. Странно, я изо всех сил пытаюсь найти какую-либо информацию об этом   -  person hvertous    schedule 26.05.2017
comment
Я предполагаю, что вы используете Doctrine\ORM\Mapping как ORM; внутри вашей чертовой сущности?   -  person Doug    schedule 27.05.2017
comment
@ Даг, да, конечно.   -  person hvertous    schedule 29.05.2017


Ответы (1)


Это возможно, только если у вашего класса City есть другое свойство $id без аннотации. Таким образом, он переопределяет $id из типажа. В противном случае убедитесь, что это именно тот класс City, а не какой-то другой из другого пространства имен.

person Artur Yukhatov    schedule 26.05.2017
comment
не совсем уверен, что понял вторую часть, поэтому я спрашиваю еще раз: вы говорите, что я должен каждый раз переопределять $id из типажа, чтобы заставить его работать? - person hvertous; 26.05.2017
comment
Он имеет в виду, что ваша сущность City должна иметь атрибут $id, и этот атрибут $id будет переопределен атрибутом из вашей черты. Если единственной целью вашего типажа является использование атрибута $id в качестве первичного ключа для всей вашей сущности, вам следует избегать его использования. - person OlivierC; 26.05.2017
comment
Я имею в виду, что если вы хотите получить идентификатор именно из черты, убедитесь, что у вас нет идентификатора внутри класса City. Потому что id из класса City будет в приоритете для доктрины, а не из трейта. - person Artur Yukhatov; 26.05.2017
comment
@ArturYukhatov У меня нет другого идентификатора, кроме черты from. Поэтому я думаю, что для доктрины просто невозможно использовать первичный ключ признаков в качестве первичного ключа для объекта, который использует признак. - person hvertous; 26.05.2017
comment
@OlivierC это плохо, иметь черту, которая устанавливает первичный ключ для объекта, который его использует, выглядит красиво - person hvertous; 26.05.2017
comment
@ user7808407 Возможно. Затем убедитесь, что у вас нет путаницы с пространствами имен и именами классов. Может быть, у вас есть другой городской класс? - person Artur Yukhatov; 26.05.2017
comment
это возможно, и для этого НЕ требуется дополнительное свойство id внутри класса, я только что проверил в одном из своих проектов - person Sam Janssens; 30.05.2017