在基本的博客應用程序,我有一個文章模塊,它允許我選擇相關的類別。 有3張桌子;文章,文章類別,類別。 2模型,Model_Article
和Model_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);
}