Position actuelle: Accueil> Derniers articles> Conseils de traitement des données pour retourner des objets imbriqués à l'aide de Pdostation :: fetchObject

Conseils de traitement des données pour retourner des objets imbriqués à l'aide de Pdostation :: fetchObject

gitbox 2025-05-12

Lorsque vous utilisez PHP et PDO pour faire fonctionner les bases de données quotidiennement, PDOSTATION :: FetchObject est une méthode très pratique, qui peut convertir directement les résultats de la requête en objets. Cependant, par défaut, il ne sera créé et ne gérera pas automatiquement plus de complexité. Si vous souhaitez que le résultat contienne des objets imbriqués, comme un objet utilisateur pour nidiquer un objet de profil , vous devez le traiter vous-même.

Voyons comment atteindre cet objectif étape par étape.

Exemple de fond

Supposons que vous ayez deux tables comme celle-ci:

 CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    profile_id INT
);

CREATE TABLE profiles (
    id INT PRIMARY KEY,
    bio TEXT,
    avatar_url VARCHAR(255)
);

Vous souhaitez interroger les données utilisateur et transformer le résultat en un objet utilisateur tout en nichant un objet de profil .

Par exemple, j'espère obtenir une structure similaire à ceci:

 User {
    id => 1,
    name => 'Alice',
    profile => Profile {
        id => 2,
        bio => 'Hello world!',
        avatar_url => 'https://gitbox.net/uploads/avatar.jpg'
    }
}

Étape 1: Définissez la classe correspondante

Nous devons créer des classes PHP pour l'utilisateur et le profil :

 class Profile {
    public int $id;
    public string $bio;
    public string $avatar_url;
}

class User {
    public int $id;
    public string $name;
    public Profile $profile;
}

Étape 2: Interrogez les données, y compris les informations de profil

Vous pouvez utiliser la requête de jointure pour récupérer les données de deux tables à la fois:

 $sql = "
    SELECT 
        u.id AS user_id,
        u.name AS user_name,
        p.id AS profile_id,
        p.bio AS profile_bio,
        p.avatar_url AS profile_avatar_url
    FROM users u
    JOIN profiles p ON u.profile_id = p.id
";
$stmt = $pdo->query($sql);

Étape 3: Utilisez FetchObject pour personnaliser la nidification

Étant donné que FetchObject ne mappe qu'une seule couche de données par défaut, nous devons assembler les objets imbriqués par nous-mêmes. Vous pouvez faire ceci:

 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $user = new User();
    $user->id = (int) $row['user_id'];
    $user->name = $row['user_name'];

    $profile = new Profile();
    $profile->id = (int) $row['profile_id'];
    $profile->bio = $row['profile_bio'];
    $profile->avatar_url = $row['profile_avatar_url'];

    $user->profile = $profile;

    // Maintenant $user Il contient la nidification Profile L'objet de
    var_dump($user);
}

Conseils: encapsuler dans une méthode générale

Si vous avez souvent besoin de gérer cela, vous pouvez le résumer dans une fonction de gadget:

 function mapRowToUser(array $row): User {
    $user = new User();
    $user->id = (int) $row['user_id'];
    $user->name = $row['user_name'];

    $profile = new Profile();
    $profile->id = (int) $row['profile_id'];
    $profile->bio = $row['profile_bio'];
    $profile->avatar_url = $row['profile_avatar_url'];

    $user->profile = $profile;

    return $user;
}

// utiliser
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $user = mapRowToUser($row);
    var_dump($user);
}

Conclusion

Bien que PDOSTATION :: FetchObject lui-même ne puisse pas créer directement des objets imbriqués, il peut être très flexible d'implémenter la cartographie complexe de structure de données via une affectation manuelle et une encapsulation. Cette méthode est plus claire, plus sécurisée que le traitement de tableau simple et plus conforme aux habitudes de développement orientées objet PHP modernes.

Si vous souhaitez simplifier davantage, vous pouvez envisager de combiner des outils ORM (tels que Eloquent, doctrine) pour traiter automatiquement ces mappages, mais pour les projets légers, cette méthode de cartographie manuelle est déjà très suffisante!