原则实体管理器 flush() 方法如何工作



在教义文档中有这样的代码:

<?php
// update_product.php <id> <new-name>
require_once "bootstrap.php";
$id = $argv[1];
$newName = $argv[2];
$product = $entityManager->find('Product', $id);
if ($product === null) {
    echo "Product $id does not exist.n";
    exit(1);
}
$product->setName($newName);
$entityManager->flush();

我不明白的是最后一部分,其中,用$product->setName()设置产品名称后,调用$entityManager->flush()方法:

$product->setName($newName);
$entityManager->flush();

在我看来,$product变量和$entityManager变量之间没有任何联系,除了$product应该包含来自$entityManager->find()方法的响应这一事实。

$entityManager->flush()怎么可能读取$product->setName()设置的值?

>这是一个ORM神奇的:)

但是,如果您认真的话,当您使用 Doctrine 获取数据时,它会向对象添加大量元数据。您只需var_dump()对象即可自行查看这些字段。

当您进行flush()时,Doctrine检查所有获取数据的所有字段,并向数据库进行事务处理。

初始化新对象时,它没有任何Doctrine元数据,因此您必须再调用一个方法persist()来添加它。

你也可以看看EntityManager的源代码,以更好地了解它是如何工作的——Doctrine是一个开源项目。

Doctrine使用身份映射模式来跟踪对象。每当你 从数据库中获取一个对象,Doctrine 将保留对 此对象在其工作单元内。保存所有实体的数组 引用是两级深度的,具有键"根实体名称"和 "id"。由于 Doctrine 允许组合键,因此 id 是排序的, 所有键列的序列化版本。

http://doctrine-orm.readthedocs.org/en/latest/reference/unitofwork.html

您可能会问它如何读取/写入实体的值,因为,嗯,它们受到保护(如果您遵循用户指南,它们应该受到保护)!

很简单,教义使用反思。

来自UnityOfWork的有趣方法,该方法计算实体是否有任何更改:https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/UnitOfWork.php#L560

最新更新