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

时间:2012-10-25 09:45:01

标签: serialization proxy doctrine doctrine-orm

我有这个基本模型:

enter image description here

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

// no other Doctrine queries were made before this one:
$book = $em->getRepository('Entities\Book')->find(1);
var_dump($book);

我获得Book实体,但也是Author的代理实体:

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的代理实体是预期的,因为当我author $book->getAuthor()时来自var_dump表的that is how Doctrine will lazy load信息。

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

然而令我震惊的是,当我查看10,000输出(which I've uploaded to pastebin for you to see)时,它包含的行数超过dummy_table1!我不希望找到的内容包括对dummy_table2book的引用,这些引用与模型中的author["dummy_table1"]=> // line 1301 object(Doctrine\DBAL\Schema\Table)#194 (10) { ["dummy_table2"]=> // line 1384 object(Doctrine\DBAL\Schema\Table)#191 (10) { 无关:

$book

Q2:这也是预期的吗?

从那里我想知道:如果我想将serialize中包含的信息存储在$book的缓存中,以便稍后在我的视图中重复使用(我不是在谈论做某些事情)使用500KB进行操作,只输出一些属性),因为我会将约{{1}}存储到书名中,这将是疯狂的,这让我想到了最后一个问题:

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

1 个答案:

答案 0 :(得分:1)

A1:实体中的关系随时存在(您已经写过,您已经了解了延迟加载)。这种关系只有在需要时才能保湿。

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

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