только идентификаторы загруженной модели - PullRequest
0 голосов
/ 08 октября 2018

Используя Laravel 5.1, у меня есть глубоко связанные и вложенные модели для моей игры HTML5.Когда игрок входит в систему, он загружает свои профили.

Каждый профиль имеет m:m выполненных квестов, m:m выполненных заданий, m:m выполненных мини-игр и т. Д.

Квесты / задачи / мини-игры имеют отношение belongsTo, т. Е. TaskbelongsTo Квест, мини-игра belongsTo Задание и т. Д.

Загрузка этих данных в профиль user-> займет уйму времени.

То, что мне нужно сделать, вместо этого - желаниезагрузить только идентификаторы tasks, minigames и т. д. для профиля.Я пробовал это через $appends:

class Profile extends BaseModel
{
    protected $with = ['game', 'quests'];

    protected $appends = ['task_ids'];

    public function getTaskIdsAttribute()
    {
        return $this->tasks->pluck('id');
    }

Тем не менее, это загружает модели и массив значений идентификатора задачи (загруженные модели task тоже стремятся загрузить своих родственных детей).tasks - массив с двумя загруженными * моделями 1023 *:

enter image description here

Мне нужно ускорить вход в систему, так как я могу загружать идентификаторы только безостальные атрибуты?


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

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

В Laravel 5.5+ вы можете использовать $with = ['tasks:id'];.

Перед этим используйте:

$profiles = Profile::with(['tasks' => function($query) {
    $query->select('id');
}])->get();
0 голосов
/ 09 октября 2018

Чтобы скрыть задачи, установите их как hidden:

protected $hidden = ['tasks'];

Чтобы получить только task_id в запросе, вызовите нетерпеливую / отложенную загрузку с помощью функции select перед возвратом модели:

public function loaded()
{
    return $this->load(['tasks' => function($q) {
        $q->select('task_id', 'foreign_key');
    }]);
}
...