首先,我尝试在互联网上搜索解决方案。但我真的不知道该搜索什么,因为我没有合适的单词。也许有人可以给我一个已经给出的答案。
这就是我的"问题":
我的数据库中有3个表:user、task、user_task。
用户当然包含用户。任务包含任务。user_task是一个关系表。它包含一个任务的id和一个用户的id。(一个任务可以有多个用户,这就是我这样做的原因。)
我想做的事情很简单。我想得到一个所有任务的列表,每个任务的用户分配给它
类似于以下内容:任务id:1,名称:洗碗,用户:bob,liam。
到目前为止,如果有两个用户被分配给一个任务,我只需要打印两次。不是专门针对CI的。
查询返回一个包含2行的result(),其中1行用于用户bob的任务,1行用于相同任务的用户liam。
array{
array{
task_id = "1",
name = "do dishes",
user = "bob"
}
array{
task_id = "1",
name = "do dishes",
user = "liam"
}
array{
task_id = "2",
name = "vacuum",
user = "liam"
}
array{
task_id = "3",
name = "Take out thrash",
user = "liam"
}
array{
task_id = "3",
name = "Take out thrash",
user = "bob"
}
}
我想要得到的是一个结果,其中有一行包含任务,在那一行中,我想要一个数组,其中每个用户的名字都分配给它
array{
array{
task_id = "1",
name = "do dishes",
user = array( "bob", "liam" )
}
array{
task_id = "2",
name = "vacuum",
user = array( "liam" )
}
array{
task_id = "3",
name = "Take out thrash",
user = array( "liam", "bob" )
}
}
有什么办法做到这一点吗?在CI和/或MySQL中?
我希望你们能帮助我,如果我有点不清楚,请随时询问一些规格。正如我所说:如果任何地方都已经有答案了,请给我指一下!
提前感谢!
干杯。
否,CI活动记录中没有任何选项可以实现这一点
你必须循环你的结果。
<?php
$result = array(
array(
'task_id' => 1,
'name' => 'do dishes',
'user' => 'bob'
),
array(
'task_id' => 1,
'name' => 'do dishes',
'user' => 'liam'
),
array(
'task_id' => 2,
'name' => 'vacuum',
'user' => 'liam'
),
array(
'task_id' => 3,
'name' => 'Take out thrash',
'user' => 'liam'
),
array(
'task_id' => 3,
'name' => 'Take out thrash',
'user' => 'bob'
),
);
function get_arrayvalues_bykeyvalue($array, $key, $key2, $v2)
{
$ret = array();
foreach($array as $arr)
{
foreach($arr as $k => $v)
{
if($arr[$key2] == $v2)
{
if($k == $key)
$ret[] = $v;
}
}
}
$u = array_unique($ret);
return (sizeof($u) == 1) ? $u[0] : $u;
}
$res = array();
foreach($result as $arr)
{
foreach($arr as $k => $v)
{
if($k == 'user')
$res[$arr['task_id']][$k] = get_arrayvalues_bykeyvalue($result, $k, 'task_id', $arr['task_id']);
else
$res[$arr['task_id']][$k] = $v;
}
}
print_r($res);
输出:
Array
(
[1] => Array
(
[task_id] => 1
[name] => do dishes
[user] => Array
(
[0] => bob
[1] => liam
)
)
[2] => Array
(
[task_id] => 2
[name] => vacuum
[user] => liam
)
[3] => Array
(
[task_id] => 3
[name] => Take out thrash
[user] => Array
(
[0] => liam
[1] => bob
)
)
)
演示:
http://3v4l.org/2E9nP
假设您的数据位于$results
内部
首先创建一个函数,检查新结果数组中已经存在的任务id。如果存在,则返回索引,否则返回flase
function get_index($array,$task_id)
{
foreach($array as $index=>$a)
{
if($a['task_id']==$task_id)
{
return $index;
}
}
return false;
}
现在编写以下代码,在$new_result 中获得您想要的结果
$new_result=array();//this will contains your desired result
foreach($results as $key=>$result)
{
$index=get_index($new_result,$result['task_id']);
if($index===false)
{
$new_result[]=array('task_id'=>$result['task_id'],'name'=>$result['name'],'users'=>array($result['user']));
}
else
{
$new_result[$index]['users'][]=$result['user'];
}
}
print_r($new_result);//this will output your desired result.
我没有你的模型,但我认为,你可以使用group_concat
型号:
$this->db->select('t.id_task, t.name, GROUP_CONCAT(u.name SEPARATOR "-") as users')
->from('tasks t')
->join('users_task ut', 't.id_task = ut.id_taks')
->join('user u', 'u.id_user = ut.id_user')
->group_by(t.id_task);
$query = $this->db->get();
return $query->result();
/*Result expected :
Array
(
[1] => Array
(
[task_id] => 1
[name] => do dishes
[users] => "John-Peter"
)
[2] => Array
(
[task_id] => 2
[name] => vacuum
[users] => "Mary-Bob"
)
) */
在那之后,一个简单的爆炸应该可以在你的控制器中完成任务。
控制器:
$tasks = $this->my_model->getTasks();
foreach($tasks as $t)
{
$t->users = explode("-", $t->users);
}