2009-09-24 130 views
1

我正在嘗試將活動記錄模式實現爲ZF項目。 我曾經與之前的類似工作合作過,效果很好。ActiveRecord和多對多的關係?

但現在我的問題,是關於如何處理多到很多與我的模型關係。

下面是一個例子:

比方說,我的用戶模型。

<?php 
require_once 'MLO/Model/Model.php'; 

class Model_User extends MLO_Model_Model 
{ 
    protected $_data = array(
     'id' => NULL, 
     'email' => NULL, 
     'password' => NULL, 
    ); 
} 

沒問題。

但是如果我添加組模型?

require_once 'MLO/Model/Model.php'; 

class Model_Group extends MLO_Model_Model 
{ 
    protected $_data = array(
     'id' => NULL, 
     'name' => NULL, 
     'desc' => NULL, 
    ); 
} 

require_once 'MLO/Model/Collection.php'; 

class Model_Groups extends MLO_Model_Collection 
{ 
    protected $_modelClass = 'Model_Group'; 
} 

我然後映射器,其轉換結果從DB來建模對象,反之亦然。

我的問題是,如何處理多到很多與我的模型的關係?

我應該在哪裏「保存關係」?

下面是一些線索,我想:

class Model_User extends MLO_Model_Model 
{ 
    protected $_data = array(
     'id' => NULL, 
     'name' => NULL, 
     'desc' => NULL, 
     'groups' => NULL, // where groups will be an instance of the Model_Groups 
    ); 
} 

用同樣的方法,其中基團會像一個數組:

array(3) { 
    [0]=> 
    array(3) { 
    ["id"]=> 
    string(1) "9" 
    ["name"]=> 
    string(1) "Guest" 
    ["desc"]=> 
    string(1) "Some desc" 
    } 
    [1]=> 
    array(3) { 
    ["id"]=> 
    string(1) "64" 
    ["name"]=> 
    string(1) "Moderator" 
    ["desc"]=> 
    string(1) "Some desc" 
    } 
    [2]=> 
    array(3) { 
    ["id"]=> 
    string(1) "5" 
    ["name"]=> 
    string(1) "Admin" 
    ["desc"]=> 
    string(1) "Some desc" 
    } 
} 

另一個想法?

P.S:我並不想處理ACL或類似的東西,它只是一個例子。

回答

0

讓我們翻譯您的問題張貼標籤 - 一個職位有多個標籤,一個標籤使用的許多職位 - 這是很容易理解的(至少對我來說):

我會[「標籤」]添加到頁面的$ _data,正如你所建議的那樣。它將是一系列被吸引的標籤對象。 Analogicaly for Tag我會添加['網頁']與Adjected頁面。但是我當然會使用延遲加載。

+0

所以你可以分配頁面和標籤(或者在我的例子中的用戶和組)來分別標記和頁面?,並傳遞數組中的類名來延遲加載標籤/頁面對象? 使用包含標籤/頁面對象的集合對象有什麼問題? – 2009-09-25 08:03:03

+0

當然,你可以使用集合... :)它是完全一樣的 - 我只是習慣這樣做,sry ...問題是你可以進入無限循環(爲頁面加載標籤每個頁面對象需要標籤,它們被加載並且每個標籤都有頁面,加載頁面...),這就是爲什麼需要延遲加載。此外,我會建議使用某種緩存來存儲結果,因爲它可能會得到相當密集的數據庫:) – 2009-09-25 12:47:57

1

Zend_Db_Table類內置了這個功能! :)

它採用「dependentTables」和「referenceMap」管理表的關係自身的概念,甚至可以做CASCADE和刪除任何東西給你,如果你的數據庫不支持參照約束

Zend_Db_Table Relationships