仅渴望加载模型ID

时间:2018-10-08 20:51:33

标签: php laravel laravel-5.1 eager-loading

使用Laravel 5.1,我为我的HTML5游戏建立了深层次的连接和嵌套模型。播放器登录后,将加载其个人资料。

每个个人资料都有m:m个完成的任务,m:m个完成的任务,m:m个完成的小游戏,等等。

任务/任务/小游戏是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的数组:

enter image description here

我需要加快登录速度,以便如何仅在没有其余属性的情况下加载ID?


$start = microtime(true);
$user = User::find(Authorizer::getResourceOwnerId(), // how can I add callback here?);
$time = microtime(true) - $start;

2 个答案:

答案 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();