我需要为USER添加一个ROLE关系 所以我做了以下事情:
$user->add('roles', $roles_ids_array );
它可以工作,但是系统尝试添加它而不检查数据库中是否存在ALREADY EXISTS关系,给我一个mysql“Duplicate entry”错误。
在Kohana 2.x中它完美运行(系统进行自动检查)。在KO3.3中是否容易做到这一点?
如何在不使用$user->has(etc)
的情况下执行此操作?
答案 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) )