在教义文档中有这样的代码:
<?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