Dans le développement quotidien, la requête conjointe multi-table (comme la jointure ) est un scénario très courant. Cependant, si vous utilisez Pdostation :: fetchObject pour obtenir les résultats directement, il est facile de rencontrer des problèmes (par exemple, les différentes tables ont le même champ de nom).
Pour éviter ces conflits et mapper correctement les propriétés d'objet, nous pouvons combiner la somme pour réaliser une élégante extraction de données.
Ce qui suit explique en détail les techniques pratiques et joint un exemple de code:
Supposons que nous ayons deux tables:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50)
);
CREATE TABLE profiles (
id INT PRIMARY KEY,
user_id INT,
bio TEXT
);
Afin de cartographier les résultats de la requête multi-table, nous pouvons créer une classe spéciale, comme:
<?php
class UserProfile
{
public $user_id;
public $username;
public $profile_id;
public $bio;
}
Notez les noms de champ ici, et la distinction a été faite, telle que user_id et profil_id .
La clé consiste à définir un alias approprié pour les champs de requête afin de s'assurer que FetchObject peut être attribué directement avec succès.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'password');
// Requête conjointe multi-table,et alias le champ
$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);
// Utiliser directement fetchObject Cartographier UserProfile Objet
while ($userProfile = $stmt->fetchObject('UserProfile')) {
echo "utilisateurID: {$userProfile->user_id}\n";
echo "utilisateur名: {$userProfile->username}\n";
echo "Introduction: {$userProfile->bio}\n";
echo "---\n";
}
L'avantage de cela est qu'il évite les conflits sur le terrain, et en même temps, la structure des objets est claire, ce qui est facile à utiliser plus tard, comme le passer à l'interface API frontale ou au traitement des données.
Si vous souhaitez être plus flexible, par exemple, en rencontrant des structures dynamiques, vous pouvez utiliser STDClass ou un trait préparé à l'avance pour coopérer avec la logique de cartographie.
Exemple:
<?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 "utilisateur名: {$dynamicProfile->username}, Introduction: {$dynamicProfile->bio}\n";
}
Bien que cette méthode soit plus flexible, elle a une performance légèrement plus faible que le support natif de FetchObject , il doit donc être choisi en fonction des besoins réels.
L'alias de champ doit être standardisé , en particulier la requête multi-table.
Le nom d'attribut d'objet doit correspondre strictement à l'alias de champ dans SQL.
S'il s'agit d'un grand projet, il est recommandé d'écrire une classe d'outils de mappeur pour gérer automatiquement les détails du mappage.
Lors de la connexion à des interfaces ou des plates-formes externes, telles que l'envoi de données d'objet à des interfaces telles que https://gitbox.net/api/user/profile , l'utilisation d'une structure d'objet claire réduira considérablement le taux d'erreur.