Vous avez essentiellement trois approches pour résoudre ce problème (dont une que j'éliminerai immédiatement) :
- Une table par classe (c'est celle que j'éliminerai );
- Un type d'enregistrement avec des colonnes facultatives ; et
- Un type d'enregistrement avec une table enfant selon le type auquel vous vous joignez.
Pour plus de simplicité, je recommande généralement (2). Donc une fois que vous avez votre table :
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(10),
name VARCHAR(100)
);
où type peut être 'AGENT' ou 'LEAD' (par exemple). Vous pouvez également utiliser des codes de type à un caractère. Vous pouvez alors commencer à remplir les blancs avec le modèle d'objet :
- Vous avez une classe parent Utilisateur ;
- Vous avez deux classes enfants :Lead et Agent ;
- Ces enfants ont un type fixe.
et il devrait se mettre en place assez facilement.
Quant à savoir comment charger dans une seule instruction, j'utiliserais une sorte d'usine. En supposant ces classes barebones :
class User {
private $name;
private $type;
protected __construct($query) {
$this->type = $query['type'];
$this->name = $query['name'];
}
...
}
class Agent {
private $agency;
public __construct($query) {
parent::constructor($query);
$this->agency = $query['agency'];
}
...
}
class Lead {
public __consruct($query) {
parent::constructor($query);
}
...
}
une usine pourrait ressembler à ceci :
public function loadUserById($id) {
$id = mysql_real_escape_string($id); // just in case
$sql = "SELECT * FROM user WHERE id = $id";
$query = mysql_query($sql);
if (!query) {
die("Error executing $sql - " . mysql_error());
}
if ($query['type'] == 'AGENT') {
return new Agent($query);
} else if ($query['type'] == 'LEAD') {
return new Lead($query);
} else {
die("Unknown user type '$query[type]'");
}
}
Alternativement, vous pouvez faire en sorte que la méthode de fabrique soit une méthode statique sur, par exemple, la classe User et/ou utiliser une table de recherche pour les types des classes.
Peut-être que polluer les classes avec la ressource de résultat de requête comme ça est une conception discutable au sens OO le plus strict, mais c'est simple et ça marche.