この問題には基本的に3つのアプローチがあります(そのうちの1つはすぐに排除します):
- クラスごとに1つのテーブル(これは削除します);
- オプションの列を持つレコードタイプ。および
- 参加するタイプに応じて子テーブルを持つレコードタイプ。
簡単にするために、私は一般的に(2)をお勧めします。したがって、テーブルができたら:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(10),
name VARCHAR(100)
);
ここで、typeは「AGENT」または「LEAD」になります(たとえば)。または、1つの文字タイプコードを使用することもできます。次に、オブジェクトモデルを使用して空白の入力を開始できます。
- ユーザーの親クラスがあります;
- リードとエージェントの2つの子クラスがあります。
- これらの子のタイプは固定されています。
簡単に配置できるはずです。
1つのステートメントでロードする方法については、ある種のファクトリを使用します。これらの最低限のクラスを想定する:
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);
}
...
}
工場は次のようになります:
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]'");
}
}
または、ファクトリメソッドをたとえばUserクラスの静的メソッドにするか、クラスの型のルックアップテーブルを使用することもできます。
おそらく、そのようなクエリ結果リソースでクラスを汚染することは、厳密なOOの意味で疑わしい設計ですが、それは単純で機能します。