In der täglichen Entwicklung verwenden wir häufig PDO, um Datenbanken zu bedienen, und Pdostatement :: FetchObject bietet eine sehr elegante Möglichkeit, Abfragenergebnisse direkt an ein Objekt zu kartieren. Wenn wir jedoch die Flexibilität der Abfrage weiter verbessern möchten, z. B. die Unterstützung komplexer Datenverarbeitung oder Zuordnung von benutzerdefinierten Datenstrukturen, können wir externe Bibliotheken kombinieren, um fortschrittlichere Abfragemethoden zu erreichen.
In diesem Artikel wird ein flexiblerer und leistungsstärkerer Abfragesystem durch pdostatement :: fetchObject mit externen Bibliotheken erstellt.
Mit der FetchObject -Methode können Sie jede Datenzeile in eine Objektinstanz einkapseln, wenn Sie Daten aus der Datenbank extrahieren. Die grundlegende Verwendung ist wie folgt:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT * FROM users');
while ($user = $stmt->fetchObject()) {
echo $user->name . "\n";
}
?>
Obwohl es einfach und einfach zu bedienen ist, ist FetchObject allein etwas dünn.
Für die Flexibilität können Bibliotheken wie Atlas \ Mapper oder Leichtgewicht PHP-Data-Mapper verwendet werden. Aber hier verwenden wir hauptsächlich einfache Beispiele und schreiben schnell selbst eine grundlegende Entitäts -Mapper.
Angenommen, wir möchten die Benutzertabelle abfragen und jeden Datensatz in eine Benutzerklasseninstanz zuordnen und automatisch kleine Unterschiede zwischen Feldern und Attributen verarbeiten.
Definieren Sie zunächst eine einfache Entitätsklasse:
<?php
// src/Entity/User.php
class User
{
public int $id;
public string $username;
public string $email;
}
?>
Schreiben Sie dann einen Basic Mapper:
<?php
// src/Mapper/UserMapper.php
class UserMapper
{
public static function map(PDOStatement $stmt): array
{
$results = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$user = new User();
$user->id = (int)$row['id'];
$user->username = $row['name']; // Das Datenbankfeld ist name,Karte zu username
$user->email = $row['email'];
$results[] = $user;
}
return $results;
}
}
?>
Rufen Sie es in der Anwendung an:
<?php
require 'src/Entity/User.php';
require 'src/Mapper/UserMapper.php';
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$users = UserMapper::map($stmt);
foreach ($users as $user) {
echo $user->username . " <" . $user->email . ">\n";
}
?>
Auf diese Weise können sie auch wenn sich die Datenbankfelder von den Namensattributnamen unterscheiden, sie können ihnen flexibel entsprechen und eine fortgeschrittenere Logik kann leicht hinzugefügt werden (z. B. Typumwandlung, verschachtelte Beziehungsverarbeitung usw.).
Wenn Ihr Projekt relativ groß ist, wird empfohlen, einen automatischen Lader des PSR-4-Standards einzuführen, z .
Fügen Sie in Composer.json hinzu:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
Dann rennen:
composer dump-autoload
Dann können Sie es in der PHP -Datei wie folgt verwenden:
<?php
require 'vendor/autoload.php';
use App\Entity\User;
use App\Mapper\UserMapper;
// ...Der gleiche Code wie oben
?>
Wenn ein Teil der Daten aus der Datenbank stammt und ein Teil davon remote ergänzt werden muss (z. B. Gitbox.nets API), kann sie auch in Kombination verwendet werden:
<?php
function fetchAdditionalData(int $userId): array
{
$json = file_get_contents("https://gitbox.net/api/userinfo/$userId");
return json_decode($json, true);
}
foreach ($users as $user) {
$extraData = fetchAdditionalData($user->id);
$user->profile_picture = $extraData['profile_picture'] ?? null;
}
?>
Auf diese Weise wird die Datenintegration der Datenbank + externe Schnittstelle sehr natürlich und leistungsfähig!