在一个基本的博客应用程序中,我有一个文章模块,它允许我选择相关类别。有3张桌子;文章,article_categories,类别。2个模型,Model_Article
并Model_Category
扩展ORM,并相应地分配了多个“通过”关系。在“编辑文章”表单提交期间,正确的方法(或更好的方法)是什么:
- 以数组格式检索所有可用
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);
}