Mysql CI:查询模型中的两个表,分解

Mysql CI:查询模型中的两个表,分解,mysql,codeigniter,multidimensional-array,resultset,explode,Mysql,Codeigniter,Multidimensional Array,Resultset,Explode,我已经想了好几天了,现在还没有领会到这一点(因为我对MVC和CI比较陌生)。我甚至不确定这是MVC、MySQL还是阵列的问题 情况:2个MySQL表 表数据:id、标题、列表 表值:id、名称 查询数据表会产生如下数组(摘录): 字段列表包含逗号分隔的值,这些值对应于值表的某些ID,如 [3] => Array ( [id] => 12 [name] => 'value12'

我已经想了好几天了,现在还没有领会到这一点(因为我对MVC和CI比较陌生)。我甚至不确定这是MVC、MySQL还是阵列的问题

情况:2个MySQL表

  • 表数据:id、标题、列表
  • 表值:id、名称
  • 查询数据表会产生如下数组(摘录):

    字段列表包含逗号分隔的值,这些值对应于值表的某些ID,如

    [3] => Array
                (
                    [id] => 12
                    [name] => 'value12'                
                )
    
    我尝试为每一行做的是:

    • 获取列表值并将其分解为数组
    • 使用值表中的结果集进行检查(通过in_array()方法)
    • 如果需要,返回ID的名称值
    • 以某种方式将其包含到主结果集中(例如,作为二维数组):

      [5] =>阵列( [id]=>4 [标题]=>栏 [列表]=>数组( [0]=>值6 [1] =>值12 ... ) )

    到目前为止,我天真的做法是

    • 对这两个表中的每个表运行查询
    • 通过in_数组比较两个结果集
    我的主要问题(在试图严格分离模型、控制器和视图时):如何在数据表结果集的“主循环”中包含值表中的名称字段

    if($q->num_rows() > 0)
    {
        $data[] = $q->result_array();
        foreach ($q->result() as $row)
        {
            $data[] = $row;
        }
        return $data;
    }
    
    如果我使用以下(繁琐的)方法,每次我自然会得到一个新项目:

    foreach ($q->result_array() as $row) 
    {
        $data[]['id'] = $row['id'];
        $data[]['title'] = $row['title'];
        $data[]['list'] = $row['year'];
    }
    
    因为这是一个MySQL数据库,所以我看不到用SQL进行分解和比较的方法(使用LIKE或其他东西)

    任何提示,即使是一个简单的信息链接,都是非常感谢的

    万分感谢


    fab

    列表和列表值之间存在多对多关系。在关系数据库中对此进行建模的传统方法是创建连接表。所以我会这样构造你的模式

    lists : list_id, title
    values : value_id, name
    list_values : list_id, value_id
    
    列表_值
    是连接表。它用值链接列表

    要构建列表,您可以在模型中使用以下函数

    function build_list($list_id)
    {
        $list = $this->get_list($list_id);
        $list->values = $this->get_list_values($list_id);
        return $list;
    }
    
    function get_list($list_id)
    {
        $sql = 'select * from lists where list_id=?';
        return $this->db->query($sql, array($list_id))->row();
    }
    
    function get_list_values($list_id)
    {
        $sql = 'select v.value_id, v.name
            from list_values lv
            join values v on v.value_id=lv.value_id
            where lv.list_id=?';
        return $this->db->query($sql, array($list_id))->result();
    }
    

    绝对地任何时候,当你考虑在一个表的列中存储一个逗号分隔的ID列表时,这都是一个强烈的信号,表明你可能做错了什么。你们是绝对正确的。当然,多对多关系总是使用联接表!谢谢。
    function build_list($list_id)
    {
        $list = $this->get_list($list_id);
        $list->values = $this->get_list_values($list_id);
        return $list;
    }
    
    function get_list($list_id)
    {
        $sql = 'select * from lists where list_id=?';
        return $this->db->query($sql, array($list_id))->row();
    }
    
    function get_list_values($list_id)
    {
        $sql = 'select v.value_id, v.name
            from list_values lv
            join values v on v.value_id=lv.value_id
            where lv.list_id=?';
        return $this->db->query($sql, array($list_id))->result();
    }