2010-08-03 7 views
1

가장 좋은 방법은 '많은 관통'관계를 폼과 편집하는 것입니다. 여러 카테고리에 속할 수있는 사용자가 있다고 가정 해 보겠습니다.Kohana "through through"관계가 있습니다

양식은 다음과 같이 몇 가지 체크 박스를했을 :

<input type="checkbox" name="category_ids" value="1" />  
<input type="checkbox" name="category_ids" value="2" /> 

그리고 내 컨트롤러에서 나는 같은 것을 할 수있는 :

// dump all relations 
DB::delete('users_categories')->where('user_id','=',$user->id)->execute(); 

// add new relations 
foreach (explode(',', $_POST['category_ids']) as $category) 
    $user->add('category', ORM::factory('category', $category)) 

는하지만 내가 더 많이 가지고도 나 때문에 (너무 복잡 보인다 하나는 '많은 관계를 맺고있다'). 거기에 kohana orm을 사용하여 더 쉽게/더 좋은 방법이 있습니까? :)

+0

"explode()"를 닫지 않았습니다. – Kemo

+0

맞습니다. 삭제도 didnt 일, 지금 그것을 고쳤다. – acidtv

답변

0

그게 내가이

// C 
$roles = ORM::factory('role')->find_all(); 
foreach ($roles as $role) 
{ 
    $action = isset($form['user']['roles'][$role->id]) ? 'add' : 'remove'; 

    // you dont need this if-statement if you'r using ko2 
    if ($action === 'add' && $user->has('roles', $role)) 
    { 
     continue; 
    } 

    $user->$action('roles', $role); 
} 

// V 
<? 
$roles = ORM::factory('role')->find_all(); 
foreach ($roles as $role): 
?> 
    <?= form::checkbox('user[roles]['.$role->id.']', $role->id, $user->has('roles', $role)) ?> 
    <?= form::label('user_roles_'.$role->id, $role->name) ?> 
    <br /> 
<? endforeach ?> 
+0

그러나 이것도 정말 효율적이지 않습니다. 그렇지 않습니까? 예를 들어 20 개의 옵션이 있고 1 개만 선택되어있는 경우 kohana는 19 개의 delete 문을 실행합니다. – acidtv

+0

당신은 단순함을 요구했습니다. 효율성은 실제로 orm의 목표는 아니며, 특히 양식 제출 논리에서 그러합니다. 하지만 사용자가 역할을 가지고 있는지 여부를 알기 때문에 사용자가 그 역할을 가지고 있지 않으면 액션을 계속할 수있는 또 다른 if-continue 문을 추가 할 수 있습니다. === 'remove' – antpaw

0

(제거 된 것을 찾기 위해 인수 역) array_diff 사용을 고려 추가 된 것을 찾으려면 어떻게().

이렇게하면 순수한 orm보다 더 효율적인 코드를 작성할 수 있습니다.