1

我有 Games 表,它具有以下架构

编号 | 状态 | 姓名

状态列有 2 个值(活动、待定)

以及具有以下架构的 GamePlayer 表

编号 | 游戏ID | player_id | 请求状态

request_status 列有 3 个值(Pending、Confirm、Rejected)

现在我必须选择玩家参与的所有游戏,但有以下限制:

如果游戏处于 Pending 状态,那么它将显示给所有 game_player 如果游戏处于 Active 状态,那么它将只显示给 request_status 为 Confirm 的 game_player。游戏(模型)

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);

请帮助我如何根据条件(父表和子表)从另一个表中填充数据。

4

2 回答 2

0

您可以使用 Laravel 方法whereHas。你应该阅读Laravel 文档的这一部分。请注意,您应该在每个模型上声明关系。

于 2020-04-24T20:40:53.347 回答
0

您可以在您的关系中使用条件来仅获取已确认的游戏玩家

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

您也可以使用范围 ( https://laravel.com/docs/7.x/eloquent#local-scopes ) 仅选择活动游戏

    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;
    }

笔记:

在您的具体情况下,我会改为从 GamePlayer 模型开始获取游戏,而不是从游戏模型开始 - 您也可以在关系中使用范围和条件,以使您的代码更具可读性。

于 2020-04-25T17:28:32.907 回答