Получить все значки с прогрессом пользователя, если таковые имеются - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть много-много отношений между пользователями и достижениями. План стола похож на этот.

users
-id
-first_name
-last_name
-email

acheivements
-id
-type-name
-description

achievement_user
-id
-acievement_id
-user_id
-is_complete (boolean)
-percentage_complete (integer)
-completed_at

Я могу получить большую часть материала, который мне нужен, например, все достижения с помощью type = badge для пользователя, находящегося в сводной таблице. Я также могу получить список всех достижений, которые имеют тип = значок. Там, где я застрял, я пытаюсь получить все достижения с помощью type = badge, а также is_complete, factor_complete, complete_at для данного пользователя. Таким образом, если всего 8 значков, и они начали 3 из них, я бы хотел вернуть 8 записей, где 3 из них будут иметь информацию из сводной таблицы. Я знаю, что могу взять все значки и пройтись по ним, чтобы добавить дополнительную информацию, но я знаю, что есть красноречивый способ, который будет проще.

Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

В отношении belongsToMany используйте функцию withPivot следующим образом:

//in User model
public function acheivements()
    {
        return $this->belongsToMany('App\Acheivement')->withPivot('is_complete', 'percentage_complete', 'completed_at');
    }

//in Acheivement model
public function users()
    {
        return $this->belongsToMany('App\User')->withPivot('is_complete', 'percentage_complete', 'completed_at');
    }
0 голосов
/ 18 сентября 2018

Это ответ на ваш недавний комментарий.

Чтобы достичь того, чего вы хотите, я ввел новый метод для модели User, называемый achievementsblock, в котором используется метод php array_map.

Я не тестировал код,но вы должны понять.

//in User model
public function achievements()
    {
        return $this->belongsToMany('App\Achievements')->withPivot('is_complete', 'percentage_complete', 'completed_at');
    }

//in User model
public function achievementsblock()
    {
        $all_achievements = Achievement::all();
        return array_map(function($temp_achievement){
            $achievement_ids = $this->achievements()->pluck('id');
            $new_temp = new \stdClass();
            $new_temp->type_name = $temp_achievement->type_name;
            $new_temp->description = $temp_achievement->description;

            if(in_array($temp_achievement->id, $achievement_ids)){
                $user_achievement = $this->achievements()->where("achievements.id","=",$temp_achievement->id)->first();
                $new_temp->is_complete = $user_achievement->is_complete;
                $new_temp->percentage_complete = $user_achievement->percentage_complete;
                $new_temp->completed_at = $user_achievement->completed_at;

            }
            else {
                $new_temp->is_complete = 0;
                $new_temp->percentage_complete = 0;
                $new_temp->completed_at = null;
            }

            return $new_temp;
        }, $all_achievements);
    }

В ваших контроллерах вы можете получить блок достижений для пользователя следующим образом:

$user_achievement_blocks = User::first()->achievementsblock();
0 голосов
/ 14 сентября 2018

Вам необходимо узнать о методе whereHas, который позволяет запрашивать отношения при получении результатов

В пользовательской модели

// создавать достиженияотношение

public function achievements()
{
    return $this->belongsToMany(Achievement::class)
              ->withPivot('is_complete', 'percentage_complete', 'completed_at');
}

// затем запросите его, как показано ниже.

$achievements= $user->achievements;

Подробнее здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...