这里我有两张 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('...', '..', '.')
到您的查询构建器
关于php - 我怎样才能避免 laravel(php) 中的嵌套查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49878989/