2012-05-14 34 views
0

在基本的博客應用程序,我有一個文章模塊,它允許我選擇相關的類別。 有3張桌子;文章,文章類別,類別。 2模型,Model_ArticleModel_Category擴展了ORM,並且相應地分配了許多'through'關係。在「編輯文章」表單提交,什麼是適當的方式(或更好的方法)來:適當的方式來處理透視數據操作(通過has_many「通過」)

  • 檢索陣列格式的所有可用category ids填充Form::select()
  • 檢索指派category ids從數據透視表,在陣列格式所選類別
  • 成功提交表單時更新數據透視表,其中一些數據透視表已存在。最好在添加/刪除相關數據之前檢查現有數據(而不是刪除所有現有的數據透視數據,然後添加所有提交的category ids)。

基本上我希望有一種方法可以獲得無需循環ORM對象的透視數據數組。

不知道我所要求的只能通過數據庫準備語句/查詢生成器來完成。如果是這樣,建議我將自己的方法(使用預處理語句/查詢生成器)添加到我的Model_Article extend ORM

我使用的當前方法是:

獲取所有類別ID

$categories_orm = ORM::factory('article_category')->find_all(); 
    foreach($categories_orm as $category_orm) { 
     $categories[$category_orm->id] = $category_orm->name; 
    } 

獲得所選類別ID

$categories_current = $article->article_categories->find_all(); 
    foreach($categories_current as $category){ 
     $categories_selected = $category->id; 
    } 

更新類別ID

$categories_orm = $article->article_categories->find_all(); 
    $categories_existing = array(); 
    foreach($categories_orm as $category){ 
     $categories_existing[] = $category->id; 
    } 
    $categories_selected = $this->request->post('category'); 

    $categories_to_remove = array_diff($categories_existing,$categories_selected); 
    $categories_to_add = array_diff($categories_selected,$categories_existing); 
    if(!empty($categories_to_remove)) { 
     $article->remove('article_categories', $categories_to_remove); 
    } 
    if(!empty($categories_to_add)) { 
     $article->add('article_categories', $categories_to_add); 
    } 

回答

0

您應該將關係表中可能重命名爲articles_categories(包括複數)遵循Kohana的公約,categories是關係較好的別名。

應使用類別模型來檢索所有類別ID。然後你循環遍歷它,就像你的例子一樣填充一個數組。

獲取所有類別。

$categories_orm = ORM::factory('category')->find_all(); 
foreach ($categories_orm as $category) 
{ 
    $categories[$categories_orm->id] = $categories_orm->name; 
} 

確保您的選擇元素給出了一個數組後的值來命名它是這樣的:

name="categories[]" 

更新的關係。

$article = ORM::factory('article', $post['article_id']); 

// do stuff (validate, update the article etc.) 

// remove all relationships 
$article->remove('categories'); 

// add new relationships 
$article->add('categories', $post['categories']); 

我可能會使用隱藏表單域要檢查是否類別關係需要更新,首先驗證。我可以想象一篇文章的類別很少會改變。