0

在一个基本的博客应用程序中,我有一个文章模块,它允许我选择相关类别。有3张桌子;文章,article_categories,类别。2个模型,Model_ArticleModel_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);
    }
4

1 回答 1

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;   
}

确保您的 select 元素在数组中提供 post 值,方法是这样命名:

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']);

我可能会使用隐藏的表单字段进行检查,以首先验证类别关系是否需要更新。我想一篇文章的类别很少改变。

于 2012-05-31T06:44:07.730 回答