使用Laravel 5.1,我为我的HTML5游戏建立了深层次的连接和嵌套模型。播放器登录后,将加载其个人资料。
每个个人资料都有m:m
个完成的任务,m:m
个完成的任务,m:m
个完成的小游戏,等等。
任务/任务/小游戏是belongsTo
关系,即任务belongsTo
任务,小游戏belongsTo
任务等。
急于将这些文件加载到用户配置文件中会花费大量时间。
然后我要做的是急于仅加载配置文件的tasks
,minigames
等ID。我通过$appends
尝试过:
class Profile extends BaseModel
{
protected $with = ['game', 'quests'];
protected $appends = ['task_ids'];
public function getTaskIdsAttribute()
{
return $this->tasks->pluck('id');
}
仍然,这会加载模型和一组任务ID值(已加载的task
模型也渴望与其相关的子级一起加载。)。 tasks
是一个具有两个渴望加载的模型Task
的数组:
我需要加快登录速度,以便如何仅在没有其余属性的情况下加载ID?
$start = microtime(true);
$user = User::find(Authorizer::getResourceOwnerId(), // how can I add callback here?);
$time = microtime(true) - $start;
答案 0 :(得分:1)
要隐藏任务,请将其设置为hidden
:
protected $hidden = ['tasks'];
要仅在查询中获取task_id,请在返回模型之前使用select函数调用eager / lazy加载:
public function loaded()
{
return $this->load(['tasks' => function($q) {
$q->select('task_id', 'foreign_key');
}]);
}
答案 1 :(得分:0)
在Laravel 5.5+中,您可以使用$with = ['tasks:id'];
。
在此之前,请使用此:
$profiles = Profile::with(['tasks' => function($query) {
$query->select('id');
}])->get();