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

时间:2015-05-02 23:44:09

标签: php kohana kohana-orm kohana-3.3

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

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

它可以工作,但是系统尝试添加它而不检查数据库中是否存在ALREADY EXISTS关系,给我一个mysql“Duplicate entry”错误。

在Kohana 2.x中它完美运行(系统进行自动检查)。在KO3.3中是否容易做到这一点?

如何在不使用$user->has(etc)的情况下执行此操作?

3 个答案:

答案 0 :(得分:1)

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

最有效的方法是在数据透视表上使用DB :: select,然后将add()包装在if语句中,其中select返回了0行。

希望这有帮助。

答案 1 :(得分:1)

您可以通过$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]);
    }
}

答案 2 :(得分:0)

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) )