仅预加载模型 ID
eager load model ids only
使用 Laravel 5.1,我为我的 HTML5 游戏建立了深度连接和嵌套模型。当玩家登录时,它会加载他们的个人资料。
每个配置文件都有 m:m
个完成的任务、m:m
个完成的任务、m:m
个完成的小游戏等
quests/tasks/minigames是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;
要隐藏任务,将它们设置为 hidden
:
protected $hidden = ['tasks'];
要在查询中只获取task_id,在返回模型之前用select函数调用eager/lazy加载:
public function loaded()
{
return $this->load(['tasks' => function($q) {
$q->select('task_id', 'foreign_key');
}]);
}
在Laravel 5.5+中,可以使用$with = ['tasks:id'];
.
在此之前,使用这个:
$profiles = Profile::with(['tasks' => function($query) {
$query->select('id');
}])->get();
使用 Laravel 5.1,我为我的 HTML5 游戏建立了深度连接和嵌套模型。当玩家登录时,它会加载他们的个人资料。
每个配置文件都有 m:m
个完成的任务、m:m
个完成的任务、m:m
个完成的小游戏等
quests/tasks/minigames是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;
要隐藏任务,将它们设置为 hidden
:
protected $hidden = ['tasks'];
要在查询中只获取task_id,在返回模型之前用select函数调用eager/lazy加载:
public function loaded()
{
return $this->load(['tasks' => function($q) {
$q->select('task_id', 'foreign_key');
}]);
}
在Laravel 5.5+中,可以使用$with = ['tasks:id'];
.
在此之前,使用这个:
$profiles = Profile::with(['tasks' => function($query) {
$query->select('id');
}])->get();