你基本上有三種方法解決這個問題(其中之一,我會立即消除):
每班
- 一個表(這是一個我會消除);
- 具有可選列的記錄類型;和
- 具有子表的記錄類型取決於您加入的類型。
爲了簡單起見,我一般推薦(2)。所以一旦你有你的桌子:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(10),
name VARCHAR(100)
);
其中類型可以是'代理'或'鉛'(例如)。或者,您可以使用一種字符類型代碼。然後,您可以使用對象模型開始填充空白:
- 您有一個用戶父類;
- 你有兩個孩子班:領導和代理;
- 那些孩子有固定類型。
它應該很容易就位。
至於如何在一個語句中加載,我會使用某種工廠。假設這些準系統類:
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]'");
}
}
或者,你可以有工廠方法上,比如說一個靜態方法,用戶類和/或使用查找類爲類的查找表。
也許用這種查詢結果資源污染類是最嚴格的OO意義上的可疑設計,但它很簡單並且可行。
我真的很喜歡這個想法。但是最讓我厭煩的是執行SQL來加載所有數據的地方......我不能把它放在User類中,因爲根據類型,我需要不同的SQL。我不想把它全部放在Agent和Lead類中,因爲大部分代碼都是相同的,我想避免複製和粘貼...理想情況下,我希望User類能夠加載共同的信息和Agent/Lead類來加載獨特的信息......但是,我每次執行2個SQL語句,每次我實例化一個Agent或Lead,這是不希望的..... – SpaDusA 2009-07-27 15:44:39
你可以做到這一點在1個SQL語句中。告訴我,你用什麼來加載一個特定的用戶?你通過什麼?一個ID?還有別的嗎? – cletus 2009-07-27 15:52:45