2015-05-13 2 views
0

Я уже несколько часов борюсь с этим в течение нескольких часов и прочитал Doctrine documentation и более documentation, но я все еще борется.Доктрина 2 - сохраняющиеся сущности в отношениях «один-к-одному»

У меня есть две таблицы. Моя таблица «lookups» является владельцем (многими) во взаимосвязи с таблицей «lookup_statuses» (одна). Существует несколько разных статусов, которые могут быть найдены в определенном порядке.

Это (я думаю) однонаправленное отношение «один ко многим».

В коде я ищу таблицу lookup_statuses и возвращаю объект, который соответствует требуемому slug. Я вызываю setLookupStatus на свой объект lookup и пытаюсь его сохранить. Я получаю сообщение об ошибке 'Новый объект был найден через связь'.

Я использовал доктрину обратной инженерии, чтобы начать мою модель домена, но я просто не могу понять, как правильно реализовать эту взаимосвязь.

Мой LookupStatuses класс (один) выглядит следующим образом:

namespace App\Lib\Domain\Datalayer; 

/** 
* LookupStatuses 
* 
* @ORM\Table(name="lookup_statuses") 
* @ORM\Entity 
*/ 
class LookupStatuses 
{ 
    /** 
    * @OneToMany(targetEntity="App\Lib\Domain\Datalayer\Lookups", mappedBy="lookupStatus", cascade={"persist", "remove"}) 
    */ 
    private $lookups; 
} 

И мой стол Lookups (много) выглядит следующим образом:

namespace App\Lib\Domain\Datalayer; 

/** 
* Lookups 
* 
* @ORM\Table(name="lookups", indexes={@ORM\Index(name="IDX_4CEC819D037A087", columns={"lookup_status_id"}), @ORM\Index(name="IDX_4CEC8194D39DE23", columns={"camera_event_id"})}) 
* @ORM\Entity 
*/ 
class Lookups 
{ 
    /** 
    * @var \App\Lib\Domain\Datalayer\LookupStatuses 
    * 
    * @ORM\ManyToOne(targetEntity="App\Lib\Domain\Datalayer\LookupStatuses", inversedBy="lookups", cascade={"persist"}) 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="lookup_status_id", referencedColumnName="id") 
    * }) 
    */ 
    private $lookupStatus; 
} 

Вот версии стека я использую :

"php": ">=5.4.0", 
"laravel/framework": "5.0.*@dev", 
"doctrine/orm": ">=2.4.0", 

Пожалуйста, помогите мне разобраться с этим, чтобы мой прецедент работал. Я хочу:

  1. Посмотрите статус в коде lookup_statuses
  2. Вызов setLookupStatus() в моем поиске объекте с объектом я получаю
  3. Упорство в поиске, чтобы сохранить новый код состояния

---- обновление: включая код ----

Это пример кода:

$lookupStatusesService = ServiceFactory::getInstance('LookupStatuses'); 

$status = $lookupStatusesService->findOne(['slug' => $slug], true); 

$cameraEventService = ServiceFactory::getInstance('CameraEvents'); 

$cameraEvent = $cameraEventService->findOne(['uuid' => $uuid], true); 

$unicodeLookupService = ServiceFactory::getInstance('UnicodeLookups'); 

$unicodeLookup = $unicodeLookupService->findOne(['cameraEvent' => 

$cameraEvent->getId()], true); 

$unicodeLookup->setLookupStatus($status); 

EntityManager::persist($unicodeLookup); 

EntityManager::flush(); 

Findone() создает QueryBuilder ИНЕК и возвращает

$queryBuilder->getQuery()->getResult(); 
+0

Можете ли вы опубликовать код, используемый в настоящее время? – SamV

ответ

0

После борьбы в течение 3 часов с этим я решил его на прогулке к машине из офиса.

Проблема в том, что я использовал Memcached.

Объект, который я получал от моего findby, был Entity Entity, но был возвращен из кеша, а не из Doctrine. Вот почему Доктрина считала, что это ново. Если я настаиваю на получении нового результата из базы данных, код работает.

Я подозреваю, что, поскольку я использую однонаправленные отношения, @OneToMany в LookupStatuses является излишним.