Bei der Verwendung von PHP und PDO zum täglichen Betrieb von Datenbanken ist pdostatement :: fetchObject eine sehr bequeme Methode, mit der Abfrageergebnisse direkt in Objekte umwandeln können. Standardmäßig wird es jedoch nur erstellt und wird nicht automatisch mehr Komplexität verarbeitet. Wenn Sie möchten, dass das Ergebnis verschachtelte Objekte enthält, z. B. ein Benutzerobjekt , um ein Profilobjekt zu benisten, müssen Sie es selbst verarbeiten.
Schauen wir uns an, wie Sie diesen Zielschritt Schritt für Schritt erreichen können.
Angenommen, Sie haben zwei Tabellen wie diese:
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)
);
Sie möchten Benutzerdaten abfragen und das Ergebnis in ein Benutzerobjekt verwandeln, während Sie ein Profilobjekt verschieben.
Zum Beispiel hoffe ich, eine ähnliche Struktur zu erhalten:
User {
id => 1,
name => 'Alice',
profile => Profile {
id => 2,
bio => 'Hello world!',
avatar_url => 'https://gitbox.net/uploads/avatar.jpg'
}
}
Wir müssen PHP -Klassen für Benutzer und Profil erstellen:
class Profile {
public int $id;
public string $bio;
public string $avatar_url;
}
class User {
public int $id;
public string $name;
public Profile $profile;
}
Sie können die Join -Abfrage verwenden, um die Daten aus zwei Tabellen gleichzeitig abzurufen:
$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);
Da FetchObject nur standardmäßig eine Datenschicht bildet, müssen wir verschachtelte Objekte selbst zusammenstellen. Sie können das tun:
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;
// Jetzt $user Es enthält Nist Profile Das Objekt von
var_dump($user);
}
Wenn Sie sich oft damit befassen müssen, können Sie es in eine Gadget -Funktion zusammenfassen:
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;
}
// verwenden
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$user = mapRowToUser($row);
var_dump($user);
}
Obwohl Pdostatement :: FetchObject selbst keine geschachtelten Objekte direkt erstellen kann, kann es sehr flexibel sein, komplexe Datenstrukturzuordnung durch manuelle Zuordnung und Kapselung zu implementieren. Diese Methode ist klarer, sicherer als die einfache Array-Verarbeitung und mehr im Einklang mit modernen, objektorientierten Entwicklungsgewohnheiten von PHP.
Wenn Sie weiter vereinfachen möchten, können Sie in Betracht ziehen, ORM -Tools (z. B. eloquent, Doktrin) zu kombinieren, um diese Zuordnungen automatisch zu verarbeiten, aber für leichte Projekte reicht diese manuelle Mapping -Methode bereits sehr aus.