In der täglichen Entwicklung ist eine gemeinsame Abfrage mit mehreren Tisch-Abfragen (z. B. Join ) ein sehr häufiges Szenario. Wenn Sie jedoch Pdostatement :: FetchObject verwenden, um die Ergebnisse direkt zu erhalten, ist es einfach, Probleme zu begegnen (beispielsweise haben verschiedene Tabellen das gleiche Feld desselben Namens).
Um diese Konflikte zu vermeiden und den Objekteigenschaften korrekt zuzuordnen, können wir die Summe kombinieren, um eine elegante Datenextraktion zu erreichen.
Im Folgenden werden praktische Techniken im Detail erläutert und den Beispielcode angeschlossen:
Angenommen, wir haben zwei Tabellen:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50)
);
CREATE TABLE profiles (
id INT PRIMARY KEY,
user_id INT,
bio TEXT
);
Um Multi-Table-Abfrageergebnisse zuzuordnen, können wir eine spezielle Klasse erstellen, wie z. B.:
<?php
class UserProfile
{
public $user_id;
public $username;
public $profile_id;
public $bio;
}
Beachten Sie hier die Feldnamen, und die Unterscheidung wurde getroffen, wie z. B. user_id und profile_id .
Der Schlüssel besteht darin, einen geeigneten Alias für die Abfragefelder festzulegen, um sicherzustellen, dass FetchObject erfolgreich direkt zugewiesen werden kann.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'password');
// Multi-Table-Joint-Abfrage,und alias das Feld
$sql = "
SELECT
u.id AS user_id,
u.username,
p.id AS profile_id,
p.bio
FROM
users u
INNER JOIN
profiles p ON u.id = p.user_id
";
$stmt = $pdo->query($sql);
// Direkt verwenden fetchObject Karte in UserProfile Objekt
while ($userProfile = $stmt->fetchObject('UserProfile')) {
echo "BenutzerID: {$userProfile->user_id}\n";
echo "Benutzer名: {$userProfile->username}\n";
echo "Einführung: {$userProfile->bio}\n";
echo "---\n";
}
Der Vorteil davon ist, dass es Feldkonflikte vermeidet und gleichzeitig die Objektstruktur klar ist, was später einfach zu verwenden ist, z. B. an die Front-End-API-Schnittstelle oder Datenverarbeitung.
Wenn Sie beispielsweise flexibler sein möchten, können Sie dynamische Strukturen begegnen, sondern können STD -Klassen oder Merkmale verwenden, die im Voraus vorbereitet sind, um mit der Kartierungslogik zusammenzuarbeiten.
Beispiel:
<?php
class DynamicUserProfile
{
public function __construct(array $data)
{
foreach ($data as $key => $value) {
$this->$key = $value;
}
}
}
$stmt = $pdo->query($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$dynamicProfile = new DynamicUserProfile($row);
echo "Benutzer名: {$dynamicProfile->username}, Einführung: {$dynamicProfile->bio}\n";
}
Obwohl diese Methode flexibler ist, hat sie eine etwas geringere Leistung als die native Unterstützung von FetchObject , sodass sie entsprechend den tatsächlichen Bedürfnissen ausgewählt werden sollte.
Das Feld Aliasing muss standardisiert werden , insbesondere Abfragen mit mehreren Tisch.
Der Objektattributname muss dem Feld Alias in SQL strikt entsprechen .
Wenn es sich um ein großes Projekt handelt, wird empfohlen, eine Mapper -Tool -Klasse zu schreiben, um automatisch zu Mapping -Details zu handhaben.
Wenn Sie eine Verbindung zu externen Schnittstellen oder Plattformen herstellen, z. B. das Senden von Objektdaten an Schnittstellen wie https://gitbox.net/api/user/profile , verringert die Verwendung einer klaren Objektstruktur die Fehlerrate erheblich.