添加关系,处理重复条目 - KOHANA 3.3

Add relationship, handling duplicating entries - KOHANA 3.3

我需要为 USER 添加 ROLE 关系。
所以我做了以下事情:

$user->add('roles', $roles_ids_array );

它有效,但系统尝试添加它而不检查数据库中是否已经存在关系,给我一个 mysql "Duplicate entry" 错误。

在 Kohana 2.x 中它工作得很好(系统会自动检查)。 KO3.3有没有简单的实现方法?

如果不使用 $user->has(etc) 怎么办?

根据文档,Kohana 3 在添加新关系之前不会检查现有关系是否存在。所以它按预期运行,但我知道这不能解决您的问题。

最有效的方法是在枢轴 table 上使用 DB::select,然后将 add() 包装在 select 已返回的 if 语句中0 行。

希望对您有所帮助。

您可以通过 $user->roles->find_all() 获取所有角色并迭代它们,通过 array_search()unset() 删除重复项,就像这样

foreach ($user->roles->find_all() as $role) {
    if (($key = array_search($role->id, $roles_ids_array)) !== FALSE) {
        unset($roles_ids_array[$key]);
    }
}
As kohana does not check for previous relations, 
we must tell it wich ids to remove/add doing this:

// two arrays: existing ids array and new ids array
// with these lines you'll get what you need, rather than doing foreach,etc
// array_diff is a php function

$ids_remove = array_diff($array1 ,$array2);
$ids_add = array_diff($array2 ,$array1);            

// now simply execute kohana's native functions to add/remove many-to-many relations

$obj->remove('relation',$ids_remove) )  
$obj->add('relation',$ids_add) )