Mysql CI:查询模型中的两个表,分解
我已经想了好几天了,现在还没有领会到这一点(因为我对MVC和CI比较陌生)。我甚至不确定这是MVC、MySQL还是阵列的问题 情况:2个MySQL表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'
[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();
}