Sie haben grundsätzlich drei Ansätze für dieses Problem (von denen ich einen sofort eliminiere):
- Ein Tisch pro Klasse (diesen werde ich eliminieren);
- Ein Datensatztyp mit optionalen Spalten; und
- Ein Datensatztyp mit einer untergeordneten Tabelle, abhängig vom Typ, dem Sie beitreten.
Der Einfachheit halber empfehle ich generell (2). Sobald Sie also Ihren Tisch haben:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(10),
name VARCHAR(100)
);
wobei der Typ beispielsweise „AGENT“ oder „LEAD“ sein kann. Alternativ können Sie auch einstellige Typcodes verwenden. Sie können dann beginnen, die Lücken mit dem Objektmodell zu füllen:
- Sie haben eine Benutzer-Elternklasse;
- Sie haben zwei untergeordnete Klassen:Lead und Agent;
- Diese Kinder haben einen festen Typ.
und es sollte sich leicht einfügen lassen.
Was das Laden in einer Anweisung betrifft, würde ich eine Art Factory verwenden. Angenommen diese Barebone-Klassen:
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);
}
...
}
eine Fabrik könnte so aussehen:
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]'");
}
}
Alternativ könnten Sie die Factory-Methode eine statische Methode auf, sagen wir, der User-Klasse sein lassen und/oder eine Nachschlagetabelle für die Typen zu Klassen verwenden.
Vielleicht ist es ein fragwürdiges Design im strengsten OO-Sinne, die Klassen mit der Abfrageergebnis-Ressource zu verschmutzen, aber es ist einfach und funktioniert.