【问题标题】:Add relationship, handling duplicating entries - KOHANA 3.3添加关系,处理重复条目 - KOHANA 3.3
【发布时间】:2015-05-02 23:44:08
【问题描述】:

我需要向 USER 添加 ROLE 关系。
所以我做了以下事情:

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

它可以工作,但系统尝试添加它而不检查数据库中是否已经存在关系,给我一个 mysql“重复条目”错误。

在 Kohana 2.x 中它可以完美运行(系统会自动检查)。在 KO3.3 中有没有容易做到的?

如果不使用$user->has(etc),我该怎么做?

【问题讨论】:

  • 如果您找到了解决方案,您应该将其放入答案中并将其标记为已接受的答案。您可以自行回答问题,不用担心。

标签: php kohana kohana-orm kohana-3.3


【解决方案1】:

根据文档,Kohana 3 在添加新关系之前不会检查现有关系是否存在。所以它的行为符合预期,但我知道这并不能解决您的问题。

最有效的方法是在数据透视表上使用 DB::select,然后将 add() 包装在 select 返回 0 行的 if 语句中。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您可以通过$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]);
        }
    }
    

    【讨论】:

    • @Theo 很高兴听到。也许您可以将其发布为带有简短解释的答案,以便将来搜索此内容的任何人都可以轻松找到它;)
    【解决方案3】:
    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) )
    

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多