Мне нужно добавить отношение ROLE к пользователю.
Итак, я сделал следующее:
$user->add('roles', $roles_ids_array );
Это работает, но система пытается добавить его, не проверяя, существует ли отношение УЖЕ В БД, что приводит к ошибке mysql «Duplicate entry».
В Kohana 2.x он работает отлично (система выполняет автоматическую проверку). Легко ли это сделать в KO3.3?
Как я могу сделать это без использования $user->has(etc)
?
Согласно документации, Kohana 3 не проверяет, существуют ли существующие отношения, прежде чем добавлять новые. Так что он ведет себя так, как задумано, но я понимаю, что это не решит вашу проблему.
Наиболее эффективный способ сделать это — использовать DB :: select в сводной таблице, а затем обернуть add () в операторе if, где select вернул 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) )