【问题标题】:PHP: iterate through array and assign a customer to a user, in turnPHP:遍历数组并依次将客户分配给用户
【发布时间】:2016-04-01 06:41:05
【问题描述】:

目的

每次操作员手动将客户添加到程序中时,他/她也会为客户分配一个区域。

有很多用户,每个用户都分配了一个或多个区域。

一旦操作员输入客户并为其分配区域,则应为该客户分配一个用户,但并不总是同一个用户,每次都必须是不同的用户(基于 area_customer 表),并且这必须依次为 (1,2,3,1,2,3,1,2...)。

因此,如果将 3 个用户分配到一个区域,则创建的客户首先分配给第一个用户,然后输入一个新客户并分配给第二个用户,输入第三个客户并分配给第三个用户用户。至此,一切重新开始。如果创建了第四个客户,则将第一个用户分配给此用户,依此类推。

详情

我有 4 个 MySQL 表:

  • 用户
  • 地区
  • Area_Users
  • 客户

Users 表有一个唯一的 id user_id 和每个用户的其他字段。

Areas 表有一个唯一的 id area_id 和一个名称字段。

Area_Users 表只有area_iduser_id,这是分配区域的地方,因此每个用户都为自己分配了一个或多个区域。

Customer 表有一个唯一的 id customer_id,有一个 area_id(与 Areas 表相关)和一个 user_assigned_id(与 Users 表相关)

我需要完成什么:

每次将客户添加到程序中时,负责人都会手动插入该客户的所有数据,包括客户被分配到的区域。

此时在 MySQL 表 Customer 中插入了一行,但应该以编程方式(而不是由人手动)添加 user_assigned_id

需要从Areas 表中计算出将哪个user_id 放入user_assigned_id 的选择。每次轮流应该是不同的人。

这是Areas 表:

|  area_id  |    name   |
-------------------------    
|     1     |    Z1     |
|     2     |    Z2     |

假设这是Area_Users 表:

|  area_id  |  user_id  |
-------------------------    
|     1     |     4     |
|     1     |     6     |
|     2     |     1     |
|     2     |     2     |
|     2     |     3     |
|     2     |     5     |
|     2     |     6     |

因此,区域 #1 分配给用户 4 和 6,而区域 #2 分配给 1、2、3、5 和 6。(注意:用户 6 分配了 2 个区域)

此时,此人为区域#2 创建了一条记录,这必须分配给用户 1,将创建的下一条记录将转到用户 #2,然后是 #3,然后是 #5,然后是 #6。比 #1 还要好。

对于区域 #1 也是如此,首先到达用户 #4,然后是 #6,然后是 #4,然后是 #6,依此类推......

我的想法是先找到Area数据:

//Codeigniter 
$areas_data = $this->db->get_where('areas', ['area_id' => 1]);

然后找出这些区域有多少用户:

$tot_users_area = $areas_data->num_rows();

然后我可以遍历它们,但我怎么知道最后一个任务是什么?而且,对于区域 #1,在用户 #4 之后来到 #6(或者可能是 #124),那么我该如何进入下一个?

【问题讨论】:

  • "此时此人为区域 #2 创建了一条记录,这必须分配给用户 1..."。" 这个“分配”是否意味着“此三元组的记录 (customer_id , area_id, user_assigned_id) 是在 Customers 表中创建的?Customers 表中的 customer_id 是否自动递增?如果不是,该值来自哪里?如果等于 user_id,为什么该字段是必需的(或为什么是user_assigned_id 字段是必需的)?
  • "Areas table has a unique id area_id"..实际上你的area表没有uniqe id..users和area之间是多对多的关系..这就是为什么你正在挣扎..当您的应用程序过去需要新功能时,这种数据库设计可能会给您的应用程序带来问题..我还担心您是否需要客户表..客户和用户之间有什么区别?
  • 也不要忘记三个原则..KISS, YAGNI & DRY..
  • 很抱歉,我完全忘记写一张桌子了……看看我的编辑。

标签: php mysql arrays codeigniter


【解决方案1】:

您真正要查找的是ROUND ROBIN METHOD。您必须在分配客户时圈出用户。

你能做什么

每当您为客户服务时,您都必须在临时表中进行另一次插入。

此临时表跟踪最后分配的用户 (userid) 和该客户的区域,当您再次分配客户时,您将首先查阅此临时表以检查最后分配的用户和只需增加该用户 ID 并分配客户。

【讨论】:

    【解决方案2】:

    如果我理解正确,并且客户表中的 customer_id 字段是自动递增的,您需要检查客户表中的“最后分配”,正如您所说的那样。

    获得所有 $areas_data 后:

    $areas_data = $this->db->get_where('areas', ['area_id' => 1]);
    

    遍历客户表中的每个 (user_id, area) 对,看看存在什么。当你找到一个不存在的对时,添加它:

    foreach($areasdata as $key => $areaDatum) {
        $result = $this->db->get_where('customers', array('area_id' => $areaDatum['area_id'], 'user_assigned_id' => $areaDatum['user_id']));
        if(!result) {
            $data = array('area_id' => $areaDatum['area_id'], 'user_assigned_id' = > $areaDatum['user_id']);
            $this->db->insert('customers', $data);
        }
    }
    

    【讨论】:

    • 我看到了你的回答,可能你没有得到我需要完成的任务。或者我可能无法正确传达它:每次将客户添加到数据库并分配到一个区域时,用户都必须分配该客户。分配给客户的区域是手动完成的,而不是自动完成的。分配给客户的用户必须是自动的。
    【解决方案3】:

    这只是一个简单的数组演示,没有使用codeigniter和数据库..

    <?php
    $customers=[1,2,3,4,5,6,7];
    $users=[1,2,3,4];
    $usercustomers = [];
    $userslen=count($users);
    
    
    foreach($customers as $customer)
    {
        if($customer > $userslen){
    
            $usercustomers = array('user'     => $customer%$userslen,
                                   'customer' => $customer);
            var_dump($usercustomers);
            echo "<br>";
    
        }
        foreach($users as $user)
        {
    
            if($customer%$user==0 && $customer==$user){
    
                $usercustomers = array('user'     => $user,
                                       'customer' => $customer);
    
                var_dump($usercustomers);
                echo "<br>";
             }
    
        }
    
    }
    
    
    
    ?>
    

    此时您可以考虑使用 ORM 包(它为此类情况提供可重用的解决方案)..因为用户和客户之间存在多对一的关系..使用 ORM 有一个简单的解决方案..@ 987654321@..同时搜索关键字"on cascade delete""on cascade insert"..使用ORM和级联会更容易..“无需重新发明轮子”..

    区域和用户之间存在多对多关系..更改数据库设计可能会对您有所帮助,强烈建议..在您当前的设计中,如果您需要获取所有区域怎么办?表区域..如果您需要使用日期获取跟踪分配怎么办?在此解决方案中,您可以在 AssignedInto 表中添加日期字段并跟踪分配等。AssignedInto 表提供用户和区域之间的关系..

    https://en.wikipedia.org/wiki/Many-to-many_(data_model)

    http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

    一个叫做教义的 ORM 包..

    http://www.doctrine-project.org/

    【讨论】:

      猜你喜欢
      • 2017-05-23
      • 2019-11-30
      • 2015-04-28
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多