Во-первых, я попытался найти решение в Интернете. Но я действительно не знаю, что искать, так как у меня нет подходящих слов для этого. Может быть, кто-то может указать мне на ответ, который уже дан.
Итак, вот моя «проблема»:
У меня есть 3 таблицы в моей базе данных: пользователь, задача, user_task.
Пользователь содержит пользователей конечно. задача содержит задачи. И user_task — это таблица отношений. Он содержит идентификатор задачи и идентификатор пользователя. (У одной задачи может быть несколько пользователей, поэтому я делаю это так.)
То, что я хочу сделать, просто. Я хочу получить список всех задач и для каждой задачи пользователей, назначенных на него.
Что-то вроде этого:
Идентификатор задачи: 1, имя: делать блюда, пользователи: Боб, Лиам.
Насколько я пришел, я мог напечатать задание только дважды, если на него было назначено 2 пользователя. Я получил так далеко, используя запрос MySQL. Не совсем специфично для CI.
Запрос возвращает результат () с 2 строками, 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?
Я надеюсь, что вы, ребята, можете мне помочь, если я немного неясен, не стесняйтесь спрашивать некоторые спецификации.
И как я уже сказал: если где-нибудь уже есть ответ, пожалуйста, укажите мне на это!
Заранее спасибо!
Приветствия.
Предположим, что ваши данные внутри $results
;
Сначала создайте функцию, которая будет проверять идентификатор задачи уже в новом массиве результатов. Если существует, возвращает индекс, иначе возвращает 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.
нет, в 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
У меня нет вашей модели, но, как я вижу, вы можете использовать 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);
}