【问题标题】:Doctrine 2 - persisting entities in a many-to-one relationship原则 2 - 在多对一关系中持久化实体
【发布时间】:2015-05-13 15:14:04
【问题描述】:

我已经为此苦苦挣扎了几个小时,并阅读了Doctrine documentation 和更多documentation,但我仍在苦苦挣扎。

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

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

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

我使用学说逆向工程来开始我的领域模型,但我就是不知道如何正确实现这种关系。

我的 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;
}

我的查找表(很多)看起来像这样:

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

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

【问题讨论】:

  • 能贴出你目前使用的代码吗?

标签: php doctrine-orm


【解决方案1】:

在为此苦苦挣扎 3 小时后,我在从办公室步行到我的汽车时解决了这个问题。

问题是我使用的是 Memcached

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

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

【讨论】:

  • @julestruong 抱歉,不,这是很久以前的事了。看看我写的解决方案是我建议从数据库中读取干净而不是使用缓存表示。
猜你喜欢
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2020-06-15
  • 2017-01-10
  • 2013-03-09
  • 2023-03-20
相关资源
最近更新 更多