2013-11-22 2 views
3

У меня есть объект Doctrine2 (называйте его сущностью A) в моем проекте Symfony2. Этот объект имеет отношения ManyToOne с другим объектом (называет его объектом B) в проекте.Doctrine2 Entity PrePersist - обновить другой объект

Объект А имеет свойство статуса, которое является «активным» или «неактивным». В объекте B. разрешено только одно «активное» сущность. Таким образом, если новый объект A добавляется к существующему объекту B, предыдущий объект A, имеющий «активный» статус, должен быть обновлен до «неактивного».

Каков наилучший подход для достижения этого?

Я думал о методах LifeCycle (prePersist), но я сомневаюсь, что это работает, потому что это другой объект, который обновляется, чем сущность, которую я сохраняю.

Пример кода:

class EntityA 
{ 
    const ACTIVE = 'active'; 
    const INACTIVE = 'inactive'; 

    private $id; 
    private $status; 
    private $entityB; 

    public function prePersist() 
    { 
     $currentEntityA = $this->entityB->getCurrentEntityA(); 
     if ($currentEntityA) { 
      $currentEntityA->setStatus(self::INACTIVE); 
     } 
    } 
} 

class EntityB 
{ 
    private $id; 
    private $name; 
    private $entityA; 

    public function getCurrentEntityA() 
    { 
     foreach($this->entityA as $row){ 
      if ($row->getStatus() == EntityA::ACTIVE) { 
       return $row; 
      } 
     } 
     //no entityA found so return null 
     return null; 
    } 
} 
+0

В этом случае, поскольку вы можете перемещаться по соотношению «А», я думаю, что это лучший подход ch (самый простой). , если вам нужно создать несвязанный, eventSubstriber # onflush() будет таким, каким я бы взял. [onflush] (http://docs.doctrine-project.org/en/2.0.x/reference/events.html#onflush) – juanmf

ответ

1

Вы должны использовать prePersist слушатель/абонент вместо LifecycleCallbacks в этом случае.

Подробнее о них в главе документации - How to register Event Listeners/Subscribers.

btw подписчик помечен doctrine.event_subscriber (в настоящее время отсутствует глава документа).

+0

Спасибо! Я проверю это в понедельник –

1

Вы можете использовать несколько подходов

Слушателей
  1. Доктрина событий
  2. служба слоя
  3. База данных триггеры

В вашей ситуации я думаю, что лучше использовать услуги и перемещать бизнес-логику там

Смежные вопросы