簡體   English   中英

原則2-以多對一關系持久化實體

[英]Doctrine 2 - persisting entities in a many-to-one relationship

我已經為此苦苦掙扎了幾個小時,並且已經閱讀了《 Doctrine》文檔和更多文檔,但是我仍然在掙扎。

我有兩張桌子。 我的“ lookups”表是與“ lookup_statuses”表(一個)有關系的所有者(許多)。 特定查找可以處於多種不同的狀態。

(我認為)這是一種單向的一對多關系。

在代碼中,我搜索lookup_statuses表,並獲取與所需子彈匹配的對象。 我在查找實體上調用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;
}

我的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();

在為此奮斗了3個小時之后,我從辦公室步行到我的車上解決了這個問題。

問題是我正在使用Memcached

我從findby獲取的對象是一個Doctrine實體,但是從緩存中返回而不是從Doctrine中返回。 這就是為什么主義認為它是新的。 如果我堅持要從數據庫中獲得新的結果,則代碼可以正常工作。

我懷疑因為我使用的是單向關系,所以LookupStatuses中的@OneToMany是多余的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM