Autor Zpráva
XolyCZ
Profil
Ahoj, potřebuju poradit. Tahám z databáze nějaké data. Asi nebudu rozepisovat co co znamená, jde to poznat z názvů, ale jedná se mi o jednu věc. Mám udělanou tabulku s pozvánkama od jiných týmů a k těm týmům potřebuju vytáhnout ještě hráče, kteří v těch týmech už jsou. Momentálně to vypadá takhle..příklad pole:
Array
(
    [0] => Array
        (
            [teamID] => 7
            [teamName] => FTWjedeBomby
            [teamType] => Duo
            [playerID] => 4
            [nickname] => Xoly
        )

    [1] => Array
        (
            [teamID] => 7
            [teamName] => FTWjedeBomby
            [teamType] => Duo
            [playerID] => 11
            [nickname] => FTW_Čokoládka
        )

)

A já bych potřeboval, aby to bylo uspořádané trošku jinak. Aby ten jeden tým byl pod jedním polem a v tom poli by bylo další pole, ve kterém by byl danný hráč. Dá se to udělat nějak pomocí jednoho příkazu? Já to mam teď takhle:
function getTeamInvites($pdo, &$getTeamInvitesMessage){
        $stmt = $pdo->prepare("SELECT teamInvitedPlayers.teamID, teams.teamName, teams.teamType, playersInTeams.playerID, players.nickname
                                FROM teamInvitedPlayers 
                                LEFT JOIN teams ON teamInvitedPlayers.teamID=teams.teamID 
                                LEFT JOIN playersInTeams ON playersInTeams.teamID=teams.teamID 
                                LEFT JOIN players ON playersInTeams.playerID=players.player_id
                                WHERE teamInvitedPlayers.playerID=?");
        $stmt->execute([$_SESSION['playerID']]);
        $teamInvites = $stmt->fetchAll();
    
    
        print_r($teamInvites);
    
        
    }
RastyAmateur
Profil
XolyCZ:
Obávám se, že v příkazu nedokážeš udělat pole v poli (nebo jsem to alespoň neviděl). Budeš to muset vyřešit nějakým jednoduchým cyklem.
Tomášeek
Profil
XolyCZ:
Je to tak, mysql neumí zgroupovat záznamy do vícerozměrného pole.

Data z databáze vytahuj tak, jak to máš teď, a finální pole si vytvoř z vrácených výsledků.

$array = [];
foreach ($teamInvites as $row) {
    $array[$row['teamID']][] = $row;
}
Kajman
Profil
Případně něco jako

$array = [];
foreach ($teamInvites as $row) {
    // udaje o tymu, pokud jeste nejsou ulozene z drivejsich radku
    if(!isset($array[$row['teamID']])) {
        $array[$row['teamID']] = [
                'teamID'   => $row['teamID'],
                'teamName' => $row['teamName'],
                'teamType' => $row['teamType'],
                'players'  => []
            ];
    }
    //udaje o hraci
    $array[$row['teamID']]['players'][$row['playerID']] = [
                'playerID' => $row['playerID'],
                'nickname' => $row['nickname']
            ];
}
$teamInvites = $array;
XolyCZ
Profil
Kajman:
No to je to co jsem chtěl. Já jsem to mezitím ještě udělal po svém, ale je to oproti tvému špatné řešení, protože se to odvíjí od dalších dotazů na databázi.. To tvoje vypíše tohle:
Array
(
    [7] => Array
        (
            [teamID] => 7
            [teamName] => FTWjedeBomby
            [teamType] => Duo
            [players] => Array
                (
                    [4] => Array
                        (
                            [playerID] => 4
                            [nickname] => Xoly
                        )

                    [11] => Array
                        (
                            [playerID] => 11
                            [nickname] => FTW_Čokoládka
                        )

                )

        )

    [8] => Array
        (
            [teamID] => 8
            [teamName] => FTW squad
            [teamType] => Squad
            [players] => Array
                (
                    [8] => Array
                        (
                            [playerID] => 8
                            [nickname] => Adis
                        )

                    [16] => Array
                        (
                            [playerID] => 16
                            [nickname] => SiVi
                        )

                )

        )

)

A to moje jsem udělal takhle:
$stmt = $pdo->prepare("SELECT teamInvitedPlayers.teamID, teams.teamName, teams.teamType
                                FROM teamInvitedPlayers 
                                LEFT JOIN teams ON teamInvitedPlayers.teamID=teams.teamID 
                                WHERE teamInvitedPlayers.playerID=?");
        $stmt->execute([$_SESSION['playerID']]);
        $teamInvites = $stmt->fetchAll();
    
    
        $team=0;
        foreach($teamInvites as $oneTeam){
            $stmt = $pdo->prepare("SELECT playersInTeams.playerID, players.nickname FROM playersInTeams LEFT JOIN players ON playersInTeams.playerID=players.player_id WHERE teamID=?");
            $stmt->execute([$oneTeam['teamID']]);
            $teamPlayers[$team] = $stmt->fetchAll();
            $team++;
        }
        
        $getTeamInvites['teamInvites'] = $teamInvites;
        $getTeamInvites['teamPlayers'] = $teamPlayers;
        
        
        
        Array
(
    [teamInvites] => Array
        (
            [0] => Array
                (
                    [teamID] => 7
                    [teamName] => FTWjedeBomby
                    [teamType] => Duo
                )

            [1] => Array
                (
                    [teamID] => 8
                    [teamName] => FTW squad
                    [teamType] => Squad
                )

        )

    [teamPlayers] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [playerID] => 4
                            [nickname] => Xoly
                        )

                    [1] => Array
                        (
                            [playerID] => 11
                            [nickname] => FTW_Čokoládka
                        )

                )

            [1] => Array
                (
                    [0] => Array
                        (
                            [playerID] => 8
                            [nickname] => Adis
                        )

                    [1] => Array
                        (
                            [playerID] => 16
                            [nickname] => SiVi
                        )

                )

        )

)
        
        
        
Kajman
Profil
V tom tvém by nemuselo být pole $teamPlayers, ale je možné to dát do toho prohledávaného
foreach($teamInvites as $key => $oneTeam){
  ...
  $teamInvites[$key]['players'] = $stmt->fetchAll();
}

Ale pro každý tým se takto dělá znovu dotaz, což bývá většinou nejpomalejší řešení, viz Srovnání dotazů do závislých tabulek
XolyCZ
Profil
Kajman:
Díky za radu, nakonec použiju radši teda to tvoje.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0