仅预加载模型 ID

eager load model ids only

使用 Laravel 5.1,我为我的 HTML5 游戏建立了深度连接和嵌套模型。当玩家登录时,它会加载他们的个人资料。

每个配置文件都有 m:m 个完成的任务、m:m 个完成的任务、m:m 个完成的小游戏等

quests/tasks/minigames是belongsTo关系,即任务belongsTo任务,小游戏belongsTo任务等

急切地将这些加载到用户->配置文件中会花费大量时间。

然后我需要做的是只为配置文件预加载 tasksminigames 等的 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();