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.
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'
}
}
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;
}
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);
É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);
}
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);
}
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!