2011-04-10 132 views
0

我多次閱讀documentationCLEARER UPDATE:自引用關係與codeigniter中的datamapper不起作用

這是表結構:

categories: 
id controller user_id approved enabled_comments 

categories_related_categories 
id category_id related_category_id 

categories_zones 
id category_id zone_id 

這是我的期望:

我想保存多個關係:

期望:

  1. 創建新類別記錄(讓我們稱之爲子類別,但實際上沒有數據庫中提到的子類別)
  2. 新類別獲取自動遞增到類別表,並給出從http post請求的查詢字符串通過php形式傳遞給controller,user_id,enabled_comments字段的值
  3. 搜索現有類別(讓我們稱它爲父類類別,但實際上沒有數據庫中提到的父類別)
  4. 將新記錄寫入categories_related_categories表,其中category_id指創建的新類別的主鍵,而related_category_id表示我們搜索的現有類別的ID 。因此,我們創建了一個多對多的自引用關係,其中一個子類別可以有多個類別,而一個父類別可以有多個子類別
  5. 類別可以有多個區域,一個區域可以有多個類別。用戶可以選擇從多選下拉列表中選擇一個或多個區域。例如,如果用戶選擇兩個區域(每個區域都使用名稱字段,如'main'或'panel'),那麼當新類別寫入數據庫時​​,不僅是用它建立的父類別在categories_zones表中創建了categories_related_categories表,其中創建了兩條記錄(如果用戶從多重選擇中選擇兩個選項),則一條記錄具有新類別的主鍵,其中一個區域記錄從多重選擇中選擇並且第二個記錄再次具有新選項的主鍵和從多選中選擇的另一個區記錄。

所以它具有與家長和區(一個或多個)的關係的子類別:

這是代碼:

public function create(){ 
     $vanity_url = new VanityUrl(); 
     $vanity_url->where('url',$this->uri->segment(2))->get(); 
     $blogger = new User(); 
     $blogger->where('id',$vanity_url->user_id)->get(); 

     /* self-referencing many to many */    
     $subcategory = new Category; //subcategory - we create a new one 
     $subcategory->controller = $this->input->post('controller'); 
     $subcategory->enable_comments = $this->input->post('approved'); 
     $subcategory->user_id = $this->current_user()->id; 

     $parent_category = new Category(); //parent category - we find via a search in the table 
     $parent_category->where('controller',$this->input->post('parent_controller'))->get(); 
    // $subcategory->save($parent_category); 

     /* many to many - category has many zones :: zone has many categories */ 
     $zone = new Zone(); 
     $zones = $this->input->post('zones'); 

     foreach($zones as $z){ 
      switch($z){ 
       case 'main': 
        $zone->where('name',$z); 
        break; 
       case 'panel': 
        $zone->where('name',$z); 
        break; 
      } 
     } 
     $zone->get(); 

     $subcategory->save($parent_category,$zone); 

    } 

我得到與上面的代碼下面的錯誤(雖然categories_zones表沒有得到寫入):

A PHP Error was encountered 

Severity: Warning 

Message: Illegal offset type in isset or empty 

Filename: libraries/Datamapper.php 

Line Number: 4151 

我試試這個:

$subcategory->save_relation($parent_category,$zone); 

但我得到這個錯誤:

An Error Was Encountered 

Unable to relate category with relation. 

然後我嘗試的例子在這個環節:http://datamapper.wanwizard.eu/pages/save.html

$subcategory->save(array($parent_category,$zone)); 

將寫入categories_related_categories表,但不categories_zones表。

我的類別和區域模型包含此:

class Category extends DataMapper { 
    var $has_one = array("user"); 

public $has_many = array(

     'related_category' => array(
      'class' => 'category', 
      'other_field' => 'category', 
      // 'reciprocal' => TRUE 
     ), 
     'category' => array(
      'other_field' => 'related_category', 
     ), 
     'post', 
     'zone' 
    ); 

} 

class Zone extends DataMapper { 
    var $has_many = array("category"); 
} 

我的臨時解決方案是最後一個註釋(截至目前): http://codeigniter.com/forums/viewthread/186054/

+0

我讀過這幾次,並且很難理解它。你能解釋或發佈你正在使用的實際表格和模型嗎?我不確定如果沒有關係表,你會如何擁有多對多的關係,但我想我錯過了一些東西。它看起來像你想要的:文件'$ has_many'文件和'$ has_many'類別和類別'$ has_many'文件 - 這是正確的嗎? – 2011-04-10 18:05:15

+0

沒有文檔與我的代碼無關。我從文檔中將其作爲示例。我的例子要容易得多:一個類別可以有許多子類別,而一個子類別可以有很多類別。所以當我做類似$ category-> sub_categories的事情時,我想獲得該類別的所有子類別。最難的部分是我不想爲類別創建兩個表格,而爲子類別創建兩個表格,因爲他們具有相同的內容。我無法弄清楚如何在datamapper中進行自引用,這樣我可以引用同一張表作爲category和subcateogyr。 – JohnMerlino 2011-04-10 19:34:05

+0

如果你可以用你正在使用的實際表格和模型更新你的問題,我可以回答這個問題。現在你的帖子到處都是。我不清楚你是否有兩個名爲'類別'和'子類別'的表格,或者只有一個表格。我也不清楚自我引用關係是否應該有一個或多個。 – 2011-04-10 19:50:22

回答

0

我知道這是一個老問題,但我會嘗試幫助其他人解決這個問題。

當您保存多重關係,你可以(而且必須在自引用關係)使用在模型中定義的數組中的關鍵一relationship_key

$subcategory->save(
    array(
     'category' => $parent_category, 
     'zone' => $zone 
    ) 
); 

看看的本頁底部爲文檔和示例: http://datamapper.wanwizard.eu/pages/save.html