教义不会保留修改后的数据

时间:2018-09-03 23:34:49

标签: php symfony doctrine

因此,我试图将一个实体保留在Doctrine中。我要保留的对象看起来像是从Symfony dump()函数中拉出的:

Time {#7751 ▼
  -id: 3
  -timeIn: DateTime {#7749 ▶}
  -timeOut: null
  -rateId: Rate {#7761 ▼
    -id: 1
    -amount: "30.00"
    -name: "Technical"
    -projectId: Project {#7756 ▶}
    -groupId: 1
  }
  -description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
  -userId: 1
  -status: "Unpaid"
  -total: null
  -cost: "60.00"
  -projectId: Project {#7756 ▼
    -id: 1
    -name: "Acme Corp"
    -description: "Metals Company"
    -contactId: 1
    -organizationId: 1
    -groupId: 1
  }
  -groupId: 1
  }

现在我显然不能坚持下去,因为我在其ID中有相应的对象。例如:rateId,projectId等。因此,为了弥补这一点,在我的clockOut函数中,我运行了一个检查以将其对象替换为其ID进行存储。请参见下面的clockOut函数:

public function clockOut($time, $group = null){
    dump($time);
    if(gettype($time) == "object"){
        if(gettype($time->getProjectId())=='object'){
            $time->setProjectId($time->getProjectId()->getId());
        }
        if(gettype($time->getRateId())=='object'){
            $time->setRateId($time->getRateId()->getId());
        }
        $this->persistClockout($time);
    }
    elseif(gettype($time) == "string"){
        if($group == null){
            return false;
        }else {
            $time = $this->findData($group, $time);
            $this->persistClockout($time);
        }
    }else {
        return false;
    }
}

还有一个相应的persistClockout函数,用于处理实际的计时和小时计算。尽管我认为这与问题没有任何关系,但我还是要把它包括在内,因为它是相关的。

/**
 * Persist time
 */
private function persistClockout($time, $group = null){
    if($time->getTimeOut() == null){
        $time->setTimeOut(new DateTime("Now"));
    }
    $this->hours = $this->hoursCalculate($time->getTimeIn(), $time->getTimeOut());
    $time->setTotal($this->hours);
    dump($time);
    die();
    $this->persist($time);
}

/**
 * Get the amount of hours spent in decimal format.
 */
private function hoursCalculate($past, $present){
    $diff = $present->diff($past);
    $hours = round($diff->s / 3600 + $diff->i / 60 + $diff->h + $diff->days * 24, 2);
    return $hours;
}

现在您可以看到,我在命令结束之前就运行了dump()函数,直到它持续存在,因为我一直在尝试自己诊断此问题。根据dump()函数,数据如下所示:

Time {#7751 ▼
  -id: 3
  -timeIn: DateTime {#7749 ▶}
  -timeOut: DateTime {#11571 ▶}
  -rateId: 1
  -description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
  -userId: 1
  -status: "Unpaid"
  -total: 187.83
  -cost: "60.00"
  -projectId: 1
  -groupId: 1
}

太好了!那是预期的结果。但是问题出在我开始尝试对数据库进行实际持久化时。

An exception occurred while executing 'UPDATE rate SET project_id = ? WHERE id = ? AND group_id = ?' with params [{}, 1, 1]:

Notice: Object of class ProjectBundle\Entity\Project could not be converted to int

虽然我在运行persist函数之前就检查了数据,但似乎我仍然认为projectId仍然是一个对象,即使我确保将其设置为实际的Id而不是对象,它也会忽略我。

>

我走得更远,查看了Symfony分析器,发现该学说用来更新和查看细节的部分,瞧,projectId是一个对象吗?即使那不是我传来的内容?

Symfony Profiler SQL update with params listed.

任何人都不知道发生了什么事?不好意思,我只是想给大家一些有关您正在使用的工具的信息。请忽略代码中的dump()和die()函数,我一直在使用这些函数来尝试对此进行诊断,但我对此感到困惑。值得注意的是,我已经尝试过运行诸如php bin / console cache:clear之类的工厂程序,然后重新启动服务器。

谢谢您提前堆栈溢出!

编辑:

下面是为-> persist()

列出的代码
    public function persist($entity, bool $flush = true)
{
    $this->manager->persist($entity);

    if ($flush) {
        $this->flush();
    }

    return $this;
}

更新

我尝试持续运行,然后分别刷新,但没有用。有同样的例外。老实说,我在这里很茫然。

2 个答案:

答案 0 :(得分:0)

我认为您需要使用以下代码:

$this->flush($time); 

代替$this->persist($time);

答案 1 :(得分:0)

我知道了。 事实证明,教义如何识别不同的数据以及它认为相同的数据是一个问题。我认为这与效率或缓存有关,也与这些方面有关。

无论如何,让我告诉你我是如何得出这个结论的。

我得到的第一个提示是,虽然rateId最初是一个对象,后来又转换为它的对应ID,但它没有像ProjectId那样引发错误。

第二,我仔细检查了dump()函数,发现了一些东西。 (我将重用原始帖子中的示例)

std::array

Project对象后面的数字相同。因此,我提出了一个理论,即该理论将原始对projectId(对象)的引用存储在某个位置,然后使用该值而不是我后来设置为相应ID(整数)的值。

因此,为了验证这一理论,我编写了两个函数,从对象树的末尾开始“平铺”我的对象(因为它实际上最多只能嵌套3个嵌套对象)到开始。这样,即使最终将它们“删除”,所有参考也都匹配。

Time {#7751 ▼
  -id: 3
  -timeIn: DateTime {#7749 ▶}
  -timeOut: null
  -rateId: Rate {#7761 ▼
    -id: 1
    -amount: "30.00"
    -name: "Technical"
    -projectId: Project {#7756 ▶}  <---- Right Here
    -groupId: 1
  }
  -description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
  -userId: 1
  -status: "Unpaid"
  -total: null
  -cost: "60.00"
  -projectId: Project {#7756 ▼  <---- Right Here
    -id: 1
    -name: "Acme Corp"
    -description: "Metals Company"
    -contactId: 1
    -organizationId: 1
    -groupId: 1
  }
  -groupId: 1
  }

运行flattenObject()函数使我可以将对象持久保存到数据库中,因为对ID的引用不再是对象。

Bam。解决了超级烦人的问题。

我希望这会在将来对某人有所帮助。谢谢大家的贡献! :)