我一直在努力解决这个问题几个小时,并且阅读了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",
请有人帮我解开这个,这样我的用例就可以了。我想:
----更新:包括代码----
这是示例代码:
$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();
答案 0 :(得分:0)
经过3个小时的努力,我从办公室走到我的车上解决了这个问题。
问题是我正在使用 Memcached 。
我从我的findby获得的对象是一个Doctrine Entity,但是从缓存返回而不是来自Doctrine。这就是为什么Doctrine认为它是新的。如果我坚持从数据库中获取新的结果,代码就可以工作。
我怀疑因为我使用的是单向关系,所以LookupStatuses中的@OneToMany是多余的。