在codeigniter中使用逗号分隔值加入查询

时间:2015-12-02 18:53:04

标签: php mysql codeigniter codeigniter-2

我有一个类似

的表结构
Table Name : crm_mrdetails

     id | mr_name | me_email     | mr_mobile  | mr_doctor|
     -------------------------------------------------
     1  | John    |abc@gmail.com | 9876543210 | 1,2      |

    Table Name : crm_mr_doctor

    id | dr_name     | specialization| product |
    -------------------------------------------- 
    1  | Abhishek    | cordiologist  | 1,2     |
    2  | Krishnan    | Physician     |2,4,5    |

    Table Name: crm_product

    id | product_name | unit| pts |
    -------------------------------- 
   1  | Crocin       | 50  | 50  | 
   2  | Crocin2      | 60  | 100 | 
   3  | Crocin3      | 30  | 90  | 
   4  | Crocin4      | 70  | 80  | 
   5  | Crocin5      | 80  | 50  |

我需要从“crm_mrdetails”表中获取数据并加入表“crm_mr_doctor”和“crm_product”,加入条件如

crm_mrdetails.mr_doctor = crm_mr_doctor.id 
crm_mr_doctor.product = crm_product.id

但是列中有逗号分隔的值,我需要以下面的方式输出。

输出:

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [mr_name] => john
            [mr_email] => abc@gmail.com
            [mr_mobile] => 9876543210
            [doctor] =>([0]=>stdClass Object
                           (
                             [id] => 1
                             [dr_name] => Abhishek
                             [product] =>([0]=>stdClass Object
                                              (
                                                [id] => 1
                                                [product_name] => crocin
                                                [unit] => 50
                                                [pts] => 50
                                              )
                                           [1]=>stdClass Object
                                              (
                                                [id] => 2
                                                [product_name] => crocin2
                                                [unit] => 60
                                                [pts] => 100
                                              ) 
                                         )

                            )
                         [1]=>stdClass Object
                          (
                             [id] => 1
                             [dr_name] => Krishnan
                             [product] =>([0]=>stdClass Object
                                              (
                                                [id] => 2
                                                [product_name] => crocin2
                                                [unit] => 60
                                                [pts] => 100
                                              )
                                           [1]=>stdClass Object
                                              (
                                                [id] => 2
                                                [product_name] => crocin4
                                                [unit] => 70
                                                [pts] => 80
                                              ) 
                                           [2]=>stdClass Object
                                              (
                                                [id] => 2
                                                [product_name] => crocin5
                                                [unit] => 80
                                                [pts] => 50
                                              ) 
                                         )

                            )
                       )
         )
)

我需要在codeigniter中编写查询以获得上面的输出请帮我实现这个结果,谢谢

1 个答案:

答案 0 :(得分:1)

<强>问题

如评论中提到的@Liam Sorsby@blckbird,您应该使用规范化规则。使用逗号分隔值不是一种好方法,当数据大小增加时,您的表将变得更加复杂。

想象一下&#34; John&#34; (with id=1)有很多医生,所以你的桌子会是这样的:

id | mr_name | me_email     | mr_mobile  | mr_doctor              |
 -----------------------------------------------------------------+
 1  | John    |abc@gmail.com | 9876543210 | 1,2,5,6,8,9,10,11,78  |

现在想象一下,您希望删除医生与id=5和Jhon (user with id=1)之间的关系

  1. 您必须获得与Jhon相关的所有医生的清单
  2. 分解结果
  3. 搜索id=5
  4. 将其删除
  5. 内爆结果
  6. 将其保存到表格中。
  7. 使用此架构,其他操作(如搜索医生和用户是否有关系,添加新关系以及删除现有关系)变得更加复杂。

    最佳解决方案:

    查看当前情况,您似乎在用户和医生之间存在many-to-many关系,即&#34;医生可以有很多患者,患者可以属于许多医生&#34 ;

    在这种情况下,您应该使用&#34;数据透视表&#34;保持两个表之间的关系。在你的情况下,它将是这样的:

    表名:crm_mrdetails

    id | mr_name | me_email     | mr_mobile    |
     ------------------------------------------+
     1  | John    |abc@gmail.com | 9876543210  |
    

    表名:crm_mr_doctor

    id | dr_name     | specialization  |
    -----------------------------------+
    1  | Abhishek    | cordiologist    |
    2  | Krishnan    | Physician       |
    

    现在您将拥有一个Pivot表来维护两个表之间的关系:

    表名:crm_doctor_mr

    id | dr_id     | mr_id  |
    ---------------+--------+
    1  |  1        |   1    |
    2  |  2        |   1    |
    

    同样的事情将与产品和医生的关系完成。

    产品和医生也有many-to-many的关系 - &#34;产品属于许多医生,医生有很多产品。&#34;

    所以你将有一个像这样的产品表:

    表名:crm_product

       id | product_name | unit| pts |
       ---+--------------+-----+-----+ 
       1  | Crocin       | 50  | 50  | 
       2  | Crocin2      | 60  | 100 | 
       3  | Crocin3      | 30  | 90  | 
       4  | Crocin4      | 70  | 80  | 
       5  | Crocin5      | 80  | 50  |
    

    用于维护关系的数据透视表:

    表名:crm_doctors_products

    id | dr_id      | product_id |
    ----------------+------------+
    1  |    1       |   1        |
    2  |    1       |   2        |
    3  |    2       |   2        |
    4  |    2       |   4        |
    5  |    2       |   5        |
    

    在数据库中进行更改后,您可以使用简单连接查询任何记录。

    另一种解决方案

    如果您处于无法对数据库进行更改的阶段您可以使用此解决方案,但我更喜欢上述解决方案。

    public function get_mr_details(){
       $mrArray = $this->db->get('crm_mrdetails')->result();
       foreach($mrArray as &$mr){
         $mr['doctor'] = $this->db->where_in('id',$mr['mr_doctor'])->get('crm_mr_doctor')->result();
         foreach($mr['doctor'] as &$dr){
             $dr['product'] = $this->db->where_in('id',$dr['product'])->get('crm_product')->result();
         }
         unset($mr['mr_doctor']); 
       }
       return $mrArray;
    
    }
    

    但是,此解决方案将导致在数据库上运行多个查询,并且随着上表中数据大小的增加,将以指数方式影响性能。

    希望这有帮助!!!