我有这个基本模型:
当我从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_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) {
无关:
$book
Q2:这也是预期的吗?
从那里我想知道:如果我想将serialize
中包含的信息存储在$book
的缓存中,以便稍后在我的视图中重复使用(我不是在谈论做某些事情)使用500KB
进行操作,只输出一些属性),因为我会将约{{1}}存储到书名中,这将是疯狂的,这让我想到了最后一个问题:
问题3:如何缓存Doctrine查询的结果?你是否将整个实体序列化到缓存中,是否将所需信息提取到数组中然后将该数组存储在缓存中,但如果是这样,它不会很快变得麻烦......?
答案 0 :(得分:1)
A1:实体中的关系随时存在(您已经写过,您已经了解了延迟加载)。这种关系只有在需要时才能保湿。
A2:巨大的var_dump
数据对于学说实体来说是正常的。请改用Doctrine\Common\Util\Debug::dump($entity)
。
A3:Doctrine有自己的查询和结果缓存机制。如果您再次查询$book
,我认为效率不高。此外,DQL支持数组水合(返回数组而不是实体)。