2015-05-02 4 views
2

Мне нужно добавить отношение ROLE к ПОЛЬЗОВАТЕЛЮ.
Так я сделал следующее:Добавить отношения, обрабатывая дублирующие записи - KOHANA 3.3 [разрешено]

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

Он работает, но система пытается добавить его без проверки, если отношение УЖЕ СУЩЕСТВУЕТ в БД, давая мне MySQL «Дублировать запись» ошибка.

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

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

+0

если вы нашли решение, вы должны поместить его в ответ и отметьте его как принятый. Вы можете самостоятельно ответить на вопрос, не волнуйтесь. –

ответ

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

Согласно документации, 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

Я сделал это, спасибо за помощь! =) – Theo

+1

@ Великолепно слушать. Может быть, вы можете опубликовать его как ответ с коротким объяснением, так что любой, кто ищет его в будущем, легко найдет его;) – kero

+0

Я отредактировал сообщение с моим решением;) – Theo