首先,我尝试在互联网上寻找解决方案。但我真的不知道要搜索什么,因为我没有正确的话。也许有人可以指出我已经给出的答案。
所以这是我的“问题”:
我的数据库中有3个表:user,task,user_task。
用户包含课程用户。任务包含任务。而user_task是一个关系表。它包含任务的id和用户的id。 (一个任务可以有多个用户,这就是我这样做的原因。)
我想做的事情很简单。我想获得所有任务的列表以及用户分配给它的每个任务。
这样的事情: 任务ID:1,名称:做菜,用户:bob,liam。
据我所知,如果分配了2个用户,我只需要打印两次任务。到目前为止,我使用了一个mysql查询。不是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"
}
}
我想得到的结果是包含任务的1行,并且在该行中我想要一个数组,其中包含分配给它的每个用户名。
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中?
我希望你们可以帮助我,如果我有点不清楚随意问一些规格。 正如我所说:如果已经有任何答案,请指出我!
提前致谢!
干杯。
答案 0 :(得分:2)
否,CI Active Records中没有任何选项可以实现这一目标 你必须循环你的结果。
<?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
答案 1 :(得分:0)
假设您的数据位于$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.
答案 2 :(得分:0)
我没有你的模型,但我怎么看,你可以使用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);
}