Aktueller Standort: Startseite> Neueste Artikel> Wie man mit assoziativen Array -Feldern in Pdostatement umgeht :: FetchObject

Wie man mit assoziativen Array -Feldern in Pdostatement umgeht :: FetchObject

gitbox 2025-05-12

Bei Verwendung von PDO für Datenbankoperationen ist pdostatement :: fetchObject eine sehr bequeme Methode, mit der eine Datenreihe aus dem Abfrageergebnis direkt zu einem Objekt zugeordnet werden kann. Wenn die Datenbank standardmäßig Felder mit Unterstrichen zurückgibt oder in verschiedenen Stilen benannt ist, kann die Verwendung von FetchObject diese Felder nicht korrekt den Eigenschaften des Objekts zuordnen. In diesem Artikel wird ausführlich erklärt, wie diese Situation anmutig umgeht.

Basisnutzungsbeispiele

Angenommen, Ihre Datenbanktabelle haben Benutzer die folgenden Felder:

  • Ausweis

  • user_name

  • E-Mail-Adresse

Im Allgemeinen können wir dies abfragen:

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'password');

$stmt = $pdo->query('SELECT id, user_name, email_address FROM users WHERE id = 1');
$user = $stmt->fetchObject();

echo $user->id;           // Normaler Ausgang
echo $user->user_name;    // Normaler Ausgang
echo $user->email_address; // Normaler Ausgang
?>

Hier sieht alles glatt aus. Wenn Ihre Entitätsklasse (z. B. Benutzer ) jedoch Camel -Benennung verwendet, wie z. B. Benutzername und E -MailAddress , weist die Verwendung von FetchObject ('Benutzer') den Wert direkt nicht korrekt zu.

Warum scheitert die Zuordnung?

Da FetchObject den Objektattributen entsprechend den von der Datenbank zurückgegebenen Spaltennamen standardmäßig direkt zugeordnet ist. Die Felder in der Datenbank sind unterstrichen ( user_name ), während die Objekte Kamel ( Benutzername ) sind, die natürlich nicht entsprechen.

Zum Beispiel die folgende Benutzerklasse :

 <?php
class User {
    public int $id;
    public string $userName;
    public string $emailAddress;
}
?>

Verwenden Sie $ stmt-> fetchObject ('user') direkt, und Benutzername und E-MailAddress können den Wert nicht erhalten.

Lösung 1: Verwenden Sie Alias ​​(as)

Am einfachsten und grobsten Weg ist es, dem Feld einen Alias ​​zu geben, der dem Objektattributnamen bei der Abfrage von SQL entspricht:

 <?php
$stmt = $pdo->query('
    SELECT 
        id,
        user_name AS userName,
        email_address AS emailAddress
    FROM users
    WHERE id = 1
');

$user = $stmt->fetchObject('User');

echo $user->userName; // Richtige Ausgabe
echo $user->emailAddress; // Richtige Ausgabe
?>

Diese Methode ist einfach und direkt, ohne die Entitätsklasse zu ändern. Wenn es jedoch viele Abfragefelder und komplexe Tabellen gibt, ist es leicht, schwierig zu halten.

Lösung 2: Karten Sie es selbst manuell selbst ab

Wenn Sie die Feldnamen in SQL unberührt halten möchten, können Sie das Array manuell herausnehmen und dem Objekt zuweisen:

 <?php
$stmt = $pdo->query('SELECT id, user_name, email_address FROM users WHERE id = 1');
$data = $stmt->fetch(PDO::FETCH_ASSOC);

$user = new User();
$user->id = $data['id'];
$user->userName = $data['user_name'];
$user->emailAddress = $data['email_address'];

echo $user->userName; // Richtige Ausgabe
?>

Dies ist flexibel, aber es ist problematisch zu schreiben. Sie müssen jedes Mal Werte manuell zuweisen, was nicht elegant genug ist.

Erweitert: Kapselung gemeinsamer Zuordnungsmethoden

Wenn Sie automatischer sein möchten, können Sie eine kleine Funktion schreiben, die das Feld Datenbank automatisch in den Kamelnamen umwandelt und dem Objekt dann den Wert zuweist.

 <?php
function snakeToCamel(string $string): string {
    return lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $string))));
}

function mapToEntity(array $data, string $className) {
    $object = new $className();
    foreach ($data as $key => $value) {
        $property = snakeToCamel($key);
        if (property_exists($object, $property)) {
            $object->$property = $value;
        }
    }
    return $object;
}

// Beispiel für die Nutzung
$stmt = $pdo->query('SELECT id, user_name, email_address FROM users WHERE id = 1');
$data = $stmt->fetch(PDO::FETCH_ASSOC);

$user = mapToEntity($data, 'User');

echo $user->userName; // Richtige Ausgabe
?>

Auf diese Weise müssen Sie nur einmal die Konvertierungslogik schreiben, und alle nachfolgenden Abfragen können automatisch verarbeitet werden.

Dinge zu beachten

  • FetchObject eignet sich für eine einfache und schnelle Datenerfassung. Wenn eine komplexe Logik erforderlich ist, wird empfohlen, ein ORM -Framework (wie Laravels eloquent, Symfony -Lehre usw.) zu verwenden.

  • Stellen Sie sicher, dass die Attribute der Entitätsklasse öffentlich sind, ansonsten können FetchObject nicht direkt zugewiesen werden.

  • Wenn Sie Attribute schützen müssen, sollten Sie mit der Konstruktionsmethode oder der magischen Methode __set () zusammenarbeiten, um die Zuordnung zu verarbeiten.

Abschluss

Pdostatement :: fetchObject ist eine bequeme, aber sorgfältige Funktion. Wenn der Feldnamenstil nicht synchronisiert ist, wird empfohlen, Alias ​​in SQL zu verwenden oder Ihre eigene Zuordnungsmethode zu schreiben, damit der Code sauber und robust gehalten werden kann. Bei mittleren und großen Projekten wird auch empfohlen, reife ORM -Bibliotheken direkt zu verwenden, um die Entitätskartierung zu verwalten, um das Fehlerrisiko zu verringern.

Wenn Sie erweiterte Tipps zu PDO, Datenbankoptimierung oder Entity -Mapping sehen möchten, können Sie unser Technologie -Blog https://gitbox.net/blog finden, um weitere Artikel zu erhalten!