Fondamentalmente hai tre approcci a questo problema (uno dei quali eliminerò immediatamente):
- Una tabella per classe (questa è quella che eliminerò);
- Un tipo di record con colonne opzionali; e
- Un tipo di record con una tabella figlio a seconda del tipo a cui ti unisci.
Per semplicità generalmente raccomando (2). Quindi una volta che hai il tuo tavolo:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(10),
name VARCHAR(100)
);
dove il tipo può essere 'AGENT' o 'LEAD' (ad esempio). In alternativa è possibile utilizzare codici di un tipo di carattere. Puoi quindi iniziare a riempire gli spazi vuoti con il modello a oggetti:
- Hai una classe genitore Utente;
- Hai due classi figlio:Lead e Agent;
- Quei bambini hanno un tipo fisso.
e dovrebbe andare a posto abbastanza facilmente.
Per quanto riguarda come caricare in una dichiarazione, userei una sorta di fabbrica. Assumendo queste classi barebone:
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);
}
...
}
una fabbrica potrebbe assomigliare a questa:
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]'");
}
}
In alternativa, potresti fare in modo che il metodo factory sia un metodo statico, ad esempio, sulla classe User e/o utilizzare una tabella di ricerca per i tipi nelle classi.
Forse inquinare le classi con la risorsa del risultato della query in questo modo è un progetto discutibile nel senso più stretto di OO, ma è semplice e funziona.