Использование один-к-одному и один-ко-многим на одной и той же сущности в доктрине 2

Мне нужно сохранить указанное состояние свойств entityProductpriceand currency.

Поэтому у меня есть следующая схема для Product:

Product:
   type: entity
   table: product
   fields:
       id:
           type: string
           length: 36
           id: true
           generator:
               strategy: UUID
       price:
           type: float
       currency:
           type: string
           length: 3
       created:
           type: datetime
           gedmo:
               timestampable:
                   on: create
       updated:
           type: datetime
           gedmo:
               timestampable:
                   on: update

   lifecycleCallbacks:
       prePersist: [ prePersist ]
       preUpdate: [ preUpdate ]

   oneToOne:
       lastPriceRevision:
           cascade: ["persist", "remove"]
           targetEntity: PriceRevision
           joinColumn:
               name: last_price_revision_id
               referencedColumnName: id
   oneToMany:
       priceRevisions:
           cascade: ["persist", "remove"]
           targetEntity: PriceRevision
           mappedBy: product

И PriceRevisionсхема сущности

PriceRevision:
    type: entity
    table: price_revision
    fields:
        id:
            type: string
            length: 36
            id: true
            generator:
                strategy: UUID
        price:
            type: float
        currency:
            type: string
            length: 3
        created:
            type: datetime
            gedmo:
                timestampable:
                    on: create
        updated:
            type: datetime
            gedmo:
                timestampable:
                    on: update
    lifecycleCallbacks: {  }

    manyToOne:
        product:
            targetEntity: Product
            inversedBy: priceRevisions
            joinColumn:
                name: product_id
                referencedColumnName: id

На продукте prePersistи preUpdateя делаю следующее:

    $priceRevision = $this->getLastPriceRevision();

    if (!$priceRevision || $this->getPrice() !== $priceRevision->getPrice()
        || $this->getCurrency() !== $priceRevision->getCurrency() 
    ) {
        $priceRevision = new PriceRevision();
        $priceRevision->setPrice($this->getPrice());
        $priceRevision->setCurrency($this->getCurrency());
        $this->addPriceRevision($priceRevision);
        $this->setLastPriceRevision($priceRevision);
    }

По созданиюProduct-все работает нормально и как положено. Новый продукт создан и он имеет PriceRevisionс таким же priceи currency.

Но когда я попытался изменить Product‘sprice, я получил ошибку в UnitOfWork.

Notice: Undefined index: 000000006c4cf70000000000719f69a2

это происходит здесь. Похоже, одна и та же сущность PriceRevisionимеет разные spl_object_hash.

public function getEntityIdentifier($entity)
{
    return $this->entityIdentifiers[spl_object_hash($entity)];
}

Как решить эту проблему?

Я нашел здесь несколько похожих вопросов, но они не решены. И некоторые из них вернулись к AuditEntityбандл.

1 ответ