Как я могу получить доступ к модели Relation, где условие дочерней и родительской таблицы в laravel? - PullRequest
1 голос
/ 24 апреля 2020

У меня есть таблица Игр, которая имеет следующую схему

id | статус | имя

столбец состояния имеет 2 значения (Active, Pending)

и таблицу GamePlayer, которая имеет следующую схему

id | game_id | player_id | request_status

столбец request_status имеет 3 значения (Pending, Confirm, Rejected)

Теперь мне нужно выбрать все игры, в которых участвует игрок, но со следующими ограничениями:

Если игра находится в состоянии ожидания, она будет показана всем game_players. Если игра находится в активном состоянии, она будет показана только game_player, для которого request_status установлено значение Confirm. Игра (модель)

public function GamePlayer()
{
        return $this->hasMany('App\Models\GamePlayer', 'game_id', 'id');
}


public function getGames($playerId)
{
        $gameList = Game::with(['GamePlayer','Category:id,name'])
         ->whereHas('GamePlayer', function ($q) use ($playerId) {
                      $q->where('player_id', $playerId);
         })->get();
        return $gameList;
}

Контроллер

$this->gameObj = new Game();
$gameList = $this->gameObj->getGames($player_id);

Пожалуйста, помогите мне, как я могу заполнить данные из другой таблицы на основе условия (родительская таблица, а также ребенок).

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

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

    public function activeGamePlayers()
    {
        return $this->hasMany('App\Models\GamePlayer', 'game_id', 'id')
            ->where('request_status', 'confirm');
    }

Вы также можете использовать области (https://laravel.com/docs/7.x/eloquent#local -области ), чтобы выбирать только активные игры

    public function scopeActive($query)
    {
        return $query->where('status', 'active');
        // You can then use $game->active()->...
    }

Так что ваш getGame будет выглядеть так:

   public function getGames($playerId)
    {
        $player = GamePlayer::find($playerId);
        if ($player->status == 'active') {
            $gameList = Game::with(['GamePlayer', 'Category:id,name'])
                ->get();
        } else {
            $gameList = Game::with(['GamePlayer', 'Category:id,name'])
                ->active()->get();
        }
        return $gameList;
    }

ПРИМЕЧАНИЕ:

в вашем конкретном случае c, я бы вместо этого начните с Модели GamePlayer, чтобы получить игры, вместо того, чтобы исходить из Модели игры - вы также можете использовать области и условия в отношениях, чтобы сделать ваш код более читабельным.

0 голосов
/ 24 апреля 2020

Вы можете использовать Laravel метод whereHas. Вы должны прочитать эту часть Laravel документации. Обратите внимание, что для каждой модели должны быть объявлены отношения.

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