0

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

情况:2个MySQL表

  1. 数据:id、title、list
  2. :id、name

查询数据表会产生如下数组(摘录):

[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] => Bar [list] => 数组([0] => value6 [1] => value12 ...))

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

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

我的主要问题(在尝试严格分离模型、控制器和视图时):如何在数据表结果集的“主循环”中包含值表中的名称字段?

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 或其他东西)。

任何提示,甚至是指向信息位的简单链接,都将受到高度赞赏。

感谢一万亿!

晶圆厂

4

1 回答 1

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();
}
于 2010-12-01T13:39:04.997 回答