2009-01-30 20 views
2

我正在構建一個使用數據映射程序模式將PHP數據庫與域對象分開的PHP應用程序。我有一個映射器類,它根據數據庫中的數據返回Site對象,並接受現有的Site對象保存回數據庫。數據映射程序模式和其他對象的自動更新

我的問題是,在系統中,所有網站中的一個(並且只有一個)必須被標記爲「主要」網站,這意味着如果我將其中一個設置爲主要網站,我希望能夠自動取消當前的主要設置。

所以,像這樣:

$mapper = new Site_Mapper(); 
$site = $mapper->fetch(2); 
$site->isPrimary = true; 
$mapper->save($site); 

會以某種方式在後臺自動執行此操作:

$mapper = new Site_Mapper(); 
$site = $mapper->fetch(1); 
$site->isPrimary = false; 
$mapper->save($site); 

的問題是,應該如何使自動更新現有的主站點去的邏輯是什麼?它必須在將對象保存回數據庫之後而不是之前發生,以防萬一數據庫查詢失敗並且您沒有站點作爲主數據庫。

乾杯, 傑克

回答

1

我個人認爲它最有意義的地方與Site_Mapper類附加的更新邏輯,特別是考慮到你處理在這兩種情況下相同的表/映射器。你可以簡單地覆蓋保存($ siteObj)方法,它的工作原理是這樣的:

public function save($siteObj) 
{ 
    // Save the passed object. 

    $sql = "UPDATE site SET isPrimary = 1 WHERE id != ?"; 

    $stmt = new PDO_Statement($sql); 

    $stmt->execute($siteObj->id); 

} 

很明顯,你可以創建任何自定義的保存()函數來更順暢做到這一點也許有點或者您可以使用一個比較以確保您確實需要運行更新語句。

1

聽起來像一個數據庫觸發器工作。

DELIMITER $$ 

CREATE TRIGGER test_trigger AFTER INSERT ON table 
    FOR EACH ROW BEGIN 
    IF NEW.isPrimary = 1 THEN 
     UPDATE table 
     SET isPrimary = 0 
     WHERE id <> NEW.id; 
    END IF; 
    END$$ 

DELIMITER ; 
+0

好的,所以...我已經看了MySQL觸發器的語法,我不知道該怎麼做。該規則應該是:在插入或更新時,如果isPrimary設置爲1,則查找其他具有isPrimary = 1的行,並將它們設置爲0. 任何想法? – 2009-01-30 22:04:27

+0

增加了一個例子。 – bobwienholt 2009-01-30 22:26:53

相關問題