php - 我怎样才能避免 laravel(php) 中的嵌套查询?

标签 php mysql sql laravel lumen

这里我有两张 table 。我想使用优化代码从这些表中检索数据。

表格:

game_sessions
Id, SessionName, StartTime

games
Id, GamesSessionId, GameName

代码A:

$sessions = DB :: select('select Id as sessionId, SessionName from game_sessions');
foreach($sessions as $session)
{
    $games = DB :: select('select Id as GameId, GameName from games where games.GameSessionId = '.$session->sessionId);  
    $session->Games = array();
    $session->Games = $games;
}
return array('status'=>true, 'session'=>$sessions);

输出:($sessions)

{
    "status": true,
    "session": 
    [
        {
            "sessionId": 1,
            "SessionName": "Regular bingo Manual",
            "Games": [
                {
                    "GameId": 1,
                    "GameName": "Game1"
                }
            ]
        },
        {
            "sessionId": 2,
            "SessionName": "Regular Automatic",
            "Games": [
                {
                    "GameId": 2,
                    "GameName": "Game2"
                },
                {
                    "GameId": 3,
                    "GameName": "Game1"
                }
            ]
        },
        {
            "sessionId": 3,
            "SessionName": "RegularDoubleAction",
            "Games": [
                {
                    "GameId": 4,
                    "GameName": "Game1"
                }
            ]
        }
    ]
}

代码 B:

$sessions = DB :: select('select game_sessions.Id as sessionId, SessionName, games.Id as GameId, games.GameName from game_sessions
            join games on games.GameSessionId = game_sessions.Id');
return array('status'=>true, 'session'=>$sessions);

输出:($sessions)

{
    "status": true,
    "session": 
    [
        {
            "sessionId": 1,
            "SessionName": "Regular bingo Manual",
            "GameId": 1,
            "GameName": "Game1"
        },
        {
            "sessionId": 2,
            "SessionName": "Regular Automatic",
            "GameId": 2,
            "GameName": "Game2"
        },
        {
            "sessionId": 2,
            "SessionName": "Regular Automatic",
            "GameId": 3,
            "GameName": "Game1"
        },
        {
            "sessionId": 3,
            "SessionName": "RegularDoubleAction",
            "GameId": 4,
            "GameName": "Game1"
        }
    ]
}

我在这里使用两种类型的代码。 在代码 A 中,我使用嵌套查询,但我将获得按 session 分组的输出。 在代码 B 中,我没有使用嵌套查询(通过使用连接避免了嵌套查询)但是我没有得到按 session 分组的输出。

我的需要是我不想使用嵌套查询,但我希望我的输出按 session 分组。 我怎样才能做到这一点?

最佳答案

您需要创建具有关系的模型

https://laravel.com/docs/5.6/eloquent

https://laravel.com/docs/5.6/eloquent-relationships

创建一个具有以下关系的 GameSession 模型:

function games() {
    return $this->hasMany(Game::class, 'GamesSessionId', 'Id');
}

Game 模型上创建反向关系:

function session () {
    return $this->belongsTo(GameSession::class)
}

这将允许您获得一个 GameSession 及其 Game

第一种方式是预加载

https://laravel.com/docs/5.6/eloquent-relationships#eager-loading

$gameSessionWithGames = GameSession::with('games')->find($gameSessionId);

这将为您提供 GameSession 及其所有 Game 作为 Collection 的属性

或直接通过关系:

$gamesForSession = GameSession::find(gameSessionId)->games;

这将返回属于 GameSession 的所有 Game

--

以上两个都会返回一个集合,然后你可以map

https://laravel.com/docs/5.6/collections#method-map

只得到你需要的结果

或者通过添加 ->select('...', '..', '.') 到您的查询构建器

https://laravel.com/docs/5.6/queries#selects

关于php - 我怎样才能避免 laravel(php) 中的嵌套查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49878989/

相关文章:

php - 保存条目到数据库

c# - 从ASP.NET C#数据库中提取img

SQL——对在多行键上连接的表使用 IN

php - mysql 倒计时时钟

javascript - 用于过滤的 PHP 和 jquery Ajax 和无限滚动

php - 使用 PHP crypt() 时,MySQL 中的密码应该使用什么字段类型

c++ - MySQL Connector C/C++ 8.0.13 - 不支持 UNICODE/UTF8?

c# - 更改不会永久保存到 SQL Server Compact 版本中

mysql - 按 A 列分组并按 B 列排序时查找行 ID

php - laravel 查询逗号分隔字符串中的位置