学说2 - 以多对一的关系持久化实体

时间:2015-05-13 15:14:05

标签: php doctrine-orm

我一直在努力解决这个问题几个小时,并且阅读了Doctrine documentation以及更多documentation,但我仍在努力。

我有两张桌子。我的“查找”表是与“lookup_statuses”表(一个)的关系中的所有者(很多)。特定查找可以有多种不同的状态。

这是(我认为)单向一对多的关系。

在代码中我搜索lookup_statuses表并返回一个与我需要的slug匹配的对象。我在查找实体上调用setLookupStatus并尝试保留它。我收到错误“通过关系找到了新实体”。

我使用了doctrine逆向工程来开始我的域模型,但我无法弄清楚如何正确实现这种关系。

My 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. 使用我得到的对象
  3. 在我的查找实体上调用setLookupStatus()
  4. 坚持查找以保存新的状态代码
  5. ----更新:包括代码----

    这是示例代码:

    $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 where子句并返回

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

1 个答案:

答案 0 :(得分:0)

经过3个小时的努力,我从办公室走到我的车上解决了这个问题。

问题是我正在使用 Memcached

我从我的findby获得的对象是一个Doctrine Entity,但是从缓存返回而不是来自Doctrine。这就是为什么Doctrine认为它是新的。如果我坚持从数据库中获取新的结果,代码就可以工作。

我怀疑因为我使用的是单向关系,所以LookupStatuses中的@OneToMany是多余的。