2

我有这个基本模型:

在此处输入图像描述

当我从表中获取一个条目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是可以预期的,因为当我这样做时,这就是Doctrine延迟加载表中信息的方式。author$book->getAuthor()

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

然而让我印象深刻的是,当我查看var_dump输出(我已上传到 pastebin 供您查看)时,它包含的不仅仅是10,000行!我没想到会找到的东西包括对模型的引用dummy_table1和与模型dummy_table2无关的book引用author

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

["dummy_table2"]=>   // line 1384
object(Doctrine\DBAL\Schema\Table)#191 (10) {

Q2:这也是预期的吗?

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

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

4

1 回答 1

1

A1:实体中的关系在任何时候都存在(你已经写过你得到了延迟加载的想法)。只有在需要时,这种关系才会水合。

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

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

于 2012-10-25T13:36:19.037 回答