1

我正在使用 symfony + Doctrine,但遇到了一个问题:
我克隆了一个现有对象,我想更改克隆上的 FK。它应该是这样的:

$dafCloned = clone $daf;
$dafState = $dafStateRepository->findOneBy(
        array(
            'name' => 'saved',
            'dafType' => 'invoice',
            'company' => $daf->getSeller(),
        ));
$dafCloned->setDafState($dafState);
var_dump($dafState->getId());
var_dump($dafCloned->getDafState()->getId());
$this->em->persist($dafCloned);
$this->em->flush();

您可能已经注意到,我在这里得到了 2 个 var_dump。这是调用此代码的自定义命令的打印:

int(5500)
int(5499)

5500 是我应该在 db 中为 $dafCloned 拥有的 id,5499 是我为 $daf 拥有的 id。
我想知道为什么我的 id 不同...我的 dafState 应该是一样的。我可能错过了一些非常愚蠢的东西,但我从早上 9 点开始就一直坚持下去......我什至试图删除我们拥有的所有缓存,移动flush()persist()无能为力:s

编辑:如果需要,添加 setDafState() 方法,但这是基本的:

public function setDafState(DafState $dafState) {

    $this->dafState = $dafState;

    return $this;
}

EDIT2:这里 getDafState() :

/**
 * Get dafState
 *
 * @return MyPath\Entity\DafState
 */
public function getDafState() {
    return $this->dafState;
}

如果您需要更多代码示例,请索取,我会编辑;)

对于对象,两者都是巨大的(教义对象),我找不到任何方法来获得有用的东西:s。我无法在 $daf 对象上 grep dafState,输出仍然很大。

编辑 3:

if ($daf->getId() == 8902) // daf test which should be duplicated
                var_dump($dafCloned->getDafState() === $dafState);

输出

bool(true)
4

2 回答 2

0

开始了。

感谢@cheesemacfly,我发现我有一个 prePersistListener 正在重置我的 dafState !

所以,下次你遇到类似上述问题的奇怪问题时,请检查你的听众!

于 2013-08-07T07:20:24.030 回答
0
$dafCloned = clone $daf; // Here your clone is the same object as the old one
$dafState = $dafStateRepository->findOneBy( // Here you get some fresh object
                array(
                        'name' => 'saved',
                        'dafType' => 'invoice',
                        'company' => $daf->getSeller(),
                ));
$dafCloned->setDafState($dafState); // Because this object is still managed by the entity manager it will set the $dafState on the old object (tracked by Id most likely)
var_dump($dafState->getId()); // Show the Id on the fresh object
var_dump($dafCloned->getDafState()->getId()); // Show the Id on the old object
$this->em->persist($dafCloned); // overwrite the old object
$this->em->flush();

这篇文章将对您有所帮助:如何将实体重新保存为 Doctrine 2 中的另一行 如果这不能解决您的问题,我将更新我的答案

于 2013-08-06T15:13:51.050 回答