Добавить отношение, обрабатывая дублирующие записи — KOHANA 3.3

Мне нужно добавить отношение ROLE к пользователю.
Итак, я сделал следующее:

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

Это работает, но система пытается добавить его, не проверяя, существует ли отношение УЖЕ В БД, что приводит к ошибке mysql «Duplicate entry».

В Kohana 2.x он работает отлично (система выполняет автоматическую проверку). Легко ли это сделать в KO3.3?

Как я могу сделать это без использования $user->has(etc)?

2

Решение

Согласно документации, Kohana 3 не проверяет, существуют ли существующие отношения, прежде чем добавлять новые. Так что он ведет себя так, как задумано, но я понимаю, что это не решит вашу проблему.

Наиболее эффективный способ сделать это — использовать DB :: select в сводной таблице, а затем обернуть add () в операторе if, где select вернул 0 строк.

Надеюсь это поможет.

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]);
}
}
1

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) )
0
По вопросам рекламы [email protected]