CI:查询模型中的两个表,爆炸

时间:2010-12-01 11:46:52

标签: mysql codeigniter multidimensional-array resultset explode

我现在正在思考这个问题并且没有掌握(因为我是MVC和CI的新手)。我甚至不确定这是否是MVC,MySQL或数组的问题。

情况:2个MySQL表格

  1. 数据:id,title,list
  2. :id,name
  3. 查询数据表会产生如下数组(摘录):

    [4] => Array
            (
                [id] => 3
                [title] => Foo                
                [list] => 1,2,3,4,6,14
            )
    
    [5] => Array
            (
                [id] => 4
                [title] => Bar                
                [list] => 2,6,9,12
            )
    

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

    [3] => Array
                (
                    [id] => 12
                    [name] => 'value12'                
                )
    

    我尝试为每一行做的是:

    • 列表 -values&将其分解为数组
    • 使用 -table(通过in_array()方法)检查​​结果集
    • 返回ID的名称值,如果
    • 以某种方式将其包含在主结果集中(例如,作为二维数组):

      [5] =>阵列(                 [id] => 4                 [title] =>酒吧                 [list] =>阵列(                                    [0] => value6                                    [1] => value12                                    ...                                 )              )

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

    • 对2个表中的每个表运行查询
    • 通过in_array
    • 比较2个结果集

    我的主要问题(尝试严格分离模型,控制器和视图时):如何在 data 表结果集的“主循环”中包含values-table中的name字段?

    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

1 个答案:

答案 0 :(得分:1)

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

lists : list_id, title
values : value_id, name
list_values : list_id, value_id

list_values是加入表。它将列表与值链接起来。

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

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();
}