Memory Yii急切加载-致命错误:内存不足

Memory Yii急切加载-致命错误:内存不足,memory,eager-loading,yii,Memory,Eager Loading,Yii,我有一个问题与Yii渴望加载。 我打开用户配置文件页面并使用: $model=User::model()->with('routes', 'likes', 'comments', 'questions', 'cityname')->findByPk($id); 关系是: 当我在注释表中有大约70条或更多注释时,我有一个错误: Fatal error: Out of memory (allocated 348651520) (tried to allocate 78 bytes) i

我有一个问题与Yii渴望加载。 我打开用户配置文件页面并使用:

$model=User::model()->with('routes', 'likes', 'comments', 'questions', 'cityname')->findByPk($id);
关系是:

当我在注释表中有大约70条或更多注释时,我有一个错误:

Fatal error: Out of memory (allocated 348651520) (tried to allocate 78 bytes) in /home/milk/kolyasya.ru/diplomyii/framework/db/CDbCommand.php on line 516
这个问题有趣的部分是,如果我用以下内容对的任何元素进行注释:

$model=User::model()->with('routes', 'likes', 'comments', /* 'questions' */, 'cityname')->findByPk($id);
然后一切都会正常运转

我检查了所有模型中的所有关系,并设置了ini_设置“内存限制”,“512M”,但我找不到问题的根源


也许我需要使用延迟加载?

您的行组合数量急剧增加。看一看,它在较小的范围内描述了相同的问题。基本上,您正在运行一个包含多个一对多连接的大型查询,类似于以下内容:

选择从'User``t' 左连接t.id=routes.author\u id上的'Route'路由 左连接'Question't.id=questions.author\u id上的问题 在t.id=comments.author\u id上左连接'Comment'注释 在t.id=likes.author\u id上左键连接'Like'likes 左键连接t.City=City.id上的'City'City 其中t.id=:id 按路线排序。id DESC,questions.id DESC,comments.id DESC,likes.id DESC 您可以接受此查询,将其修改为选择COUNT*,然后在phpMyAdmin中运行它以查看它返回的行数。它将等于路由数乘以问题数乘以评论数乘以该用户创建的喜欢数

在这种情况下,在单独的查询中获取每个HAS\u MANY关系将更加有效:

$model=User::model ->带阵列 “路由”=>array“在一起”=>false, 'likes'=>array'ather'=>false, '注释'=>array'在一起'=>false, “问题”=>数组“在一起”=>错误, “cityname”=>数组, ->findByPk$id; 如果您这样做,Yii将生成多个SQL查询,而占用的内存更少,如下所示:

选择从'User``t' 左键在't'上加入'City``City`.'City`='City`.`id` 其中`t`.`id`=:id; 选择从'Route``路由` 其中`author\u id`=:id 按“路线”排序。`id`DESC; 选择从“问题”到“问题”` 其中`author\u id`=:id 按“问题”排序。`id`DESC; 选择来自“Comment`` comments` 其中`author\u id`=:id 按“注释”排序。`id`DESC; 选择从“Like”到“likes”` 其中`author\u id`=:id 按'likes'排序。'id'DESC;
结果将像以前一样聚合并返回到代码中。

Hi。首先,描述此加载的目标。您将在结果页上查看什么?仅针对评论、喜欢等。?可能是,带有其他页面链接的计数器?换句话说,你需要的是用户评论的内容还是仅仅是数字?我需要内容,因为我有带有最后评论、路线等的选项卡。我知道如何优化这一点,但我真的很感兴趣,如果我从withYou中删除任何相关表,为什么它都能工作?你可能不需要显示单个用户最后70条评论。因此,重新定义你们的关系并增加一个限制是有意义的,比如说20。。。这样,您只检索您需要的东西,而不是您可能根本不用的东西。谢谢!很好的回答,不客气。如果有帮助的话,请告诉我。
$model=User::model()->with('routes', 'likes', 'comments', /* 'questions' */, 'cityname')->findByPk($id);