Je hebt in principe drie benaderingen voor dit probleem (waarvan ik er één onmiddellijk zal elimineren):
- Eén tafel per klas (dit is degene die ik zal elimineren);
- Een recordtype met optionele kolommen; en
- Een recordtype met een onderliggende tabel, afhankelijk van het type waaraan u deelneemt.
Voor de eenvoud raad ik over het algemeen (2) aan. Dus als je eenmaal je tafel hebt:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(10),
name VARCHAR(100)
);
waarbij type 'AGENT' of 'LEAD' kan zijn (bijvoorbeeld). Als alternatief kunt u codes van één tekentype gebruiken. U kunt dan beginnen met het invullen van de lege plekken met het objectmodel:
- Je hebt een bovenliggende gebruikersklasse;
- Je hebt twee onderliggende klassen:Lead en Agent;
- Die kinderen hebben een vast type.
en het zou vrij gemakkelijk op zijn plaats moeten vallen.
Wat betreft het laden in één verklaring, zou ik een soort fabriek gebruiken. Uitgaande van deze barebones-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);
}
...
}
een fabriek zou er zo uit kunnen zien:
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]'");
}
}
Als alternatief kunt u de fabrieksmethode een statische methode laten zijn voor bijvoorbeeld de klasse User en/of een opzoektabel gebruiken voor de typen naar klassen.
Misschien is het op die manier vervuilen van de klassen met de zoekresultaatbron een twijfelachtig ontwerp in de strikte OO-zin, maar het is eenvoudig en het werkt.