Serialization 为什么我的代理实体持有这么多信息?

Serialization 为什么我的代理实体持有这么多信息?,serialization,proxy,doctrine,doctrine-orm,Serialization,Proxy,Doctrine,Doctrine Orm,我有这个基本模型: 当我从book表中获取条目并转储输出时: // no other Doctrine queries were made before this one: $book = $em->getRepository('Entities\Book')->find(1); var_dump($book); 我得到了书籍实体,但也得到了作者的代理实体: object(Entities\Book)#179 (3) { ["id":"Entities\Book":priva

我有这个基本模型:

当我从
book
表中获取条目并转储输出时:

// no other Doctrine queries were made before this one:
$book = $em->getRepository('Entities\Book')->find(1);
var_dump($book);
我得到了
书籍
实体,但也得到了
作者
的代理实体:

object(Entities\Book)#179 (3) {
  ["id":"Entities\Book":private]=>
  int(1)
  ["title":"Entities\Book":private]=>
  string(7) "MyBook1"
  ["author":"Entities\Book":private]=>
  object(Doctrine\Proxy\__CG__\Entities\Author)#171 (5) {
  [...]  // many more lines of output
我的理解是,
Author
的代理实体是可以预期的,因为当我执行
$book->getAuthor()
时,
Author
表中的信息

Q1:您确认代理作者实体在此阶段预计会出现吗?

然而,让我印象深刻的是,当我查看
var_dump
output(),它包含的行数超过了
10000行!我不希望找到的内容包括对模型中与
书籍
作者
无关的
虚拟表格1
虚拟表格2
的引用:

["dummy_table1"]=>    // line 1301
object(Doctrine\DBAL\Schema\Table)#194 (10) {

["dummy_table2"]=>   // line 1384
object(Doctrine\DBAL\Schema\Table)#191 (10) {
Q2:这也是预期的吗?

从那以后,我想知道:如果我想将
$book
中包含的信息与
序列化一起存储在缓存中,以便以后在我的视图中重复使用(我不是说用
$book
执行一些操作,只是输出一些属性),这将是疯狂的,因为我会存储大约500KB的
500KB
作为书名,这就引出了最后一个问题:


Q3:如何缓存条令查询的结果?您是否将整个实体序列化到缓存中,您是否将所需的信息提取到数组中,然后将该数组存储在缓存中,但如果是这样,它是否会很快变得很麻烦……?

A1:实体中的关系随时都存在(您已经写过,您知道延迟加载的概念)。只有在需要的时候,这种关系才会得到改善

A2:对于条令实体来说,巨大的
var_dump
数据是正常的。改用
Doctrine\Common\Util\Debug::dump($entity)


A3:Doctrine有自己的查询和结果缓存机制。我认为如果您再次查询
$book
,效率不会很低。此外,DQL支持数组水合作用(返回一个数组而不是一个实体)。

关于
A3
:由于我没有使用
DQL
,数组水合作用不会有多大帮助:
doctor
是否有类似的工具将实体转换为数组,如
$em->getRepository('entities\Book')->find(1)->toArray()?(我找不到,所以我写了我自己的函数,它可以很好地工作,并从关系中排除数据,但我想如果
Doctrine`有一种原生的方法,它会更有效。)@user359650:很遗憾-没有。但是,是的,你可以编写一个函数,在实体类中获得所需的值(然后您可以执行
…->find(1)->BookToArray()
或任何调用该函数的操作)。