Codeigniter: запросы к базам данных возвращают несколько результатов - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь запросить базу данных, создавая соединение между двумя таблицами.

В частности, у меня есть список доцентов, и у каждого доцента есть Повестка дня с данными, и часы чередуются с часом. Например, в таблице

Повестка дня

id | docent_id | date       | start | end   |
1  |      1    | 2020-05-29 | 09:00 | 10:00 |
2  |      1    | 2020-05-29 | 10:00 | 11:00 |
3  |      2    | 2020-05-29 | 09:00 | 10:00 |

Итак, у меня в контроллере:

public function docent_get()
    {
        $this->load->model('Docent_model');
        $result = $this->docent_model->getDocent();
        if (is_null($result)) {
            $this->response(null, 404);
            return;
        }
        $this->response($result, 200);

    }

и в моей модели:

public function getDocent()
    {
        $roles = 'Docent';
        $query = $this->db->select('Persons.id, Persons.name, Persons.surname, Agenda.date, Agenda.start_at, Agenda.end_at')
                ->from('Persons')
                ->join('Agenda', 'Persons.id = Agenda.docent_id', 'INNER')
                ->where('Agenda.free', 'true')
                ->where('roles', $roles)
                ->get();
        return $query->result();

Теперь этот запрос работает, но результатом этого запроса, например, является массив из трех, в котором доцент с одинаковым идентификатором, но разными часами повторяется дважды. По вашему мнению, возможно ли изменить ответ так, чтобы получить массив из двух, а в случае учителя с несколькими датами иметь внутри другой массив? (или что-то подобное)

Потому что на данный момент у меня есть:

(3) [{…}, {…}, {…}]
0: {id: "1", name: "name1", surname: "surname1", date: "2020-05-29", start: "09:00:00", end: "10:00:00"}
1: {id: "1", name: "name1", surname: "surname1", date: "2020-05-29", start: "10:00:00", end: "11:00:00"}
2: {id: "2", name: "name2", surname: "surname2", date: "2020-05-29", start: "09:00:00", end: "10:00:00"}
length: 3
__proto__: Array(0)

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Вы можете использовать следующую функцию для получения ожидаемого ответа:

public function getDocent()
    {
        $roles = 'Docent';
        $arr_return = array();
        $query = $this->db->select('Persons.id, Persons.name, Persons.surname, Agenda.date, Agenda.start, Agenda.end')
                ->from('Persons')
                ->join('Agenda', 'Persons.id = Agenda.docent_id', 'INNER')
                ->where('Agenda.free', 'true')
                ->where('roles', $roles)    
                ->get();
        $arr_result = $query->result_array();
        foreach($arr_result as $key=>$result)
        {
            if(!isset($arr_return[$result['id']]))
            $arr_return[$result['id']] = array('name'=> $result['name'], 'surname' => $result['surname']);

            $arr_return[$result['id']]['docent'][] = array('start'=> $result['start'], 'end'=> $result['end']);
        }

        //print_r($arr_return);
        return $arr_return;     
    }

Вывод будет выглядеть следующим образом:

Array
(
    [1] => Array
        (
            [name] => Sanjay
            [surname] => Surve
            [docent] => Array
                (
                    [0] => Array
                        (
                            [start] => 09:00
                            [end] => 10:00
                        )

                    [1] => Array
                        (
                            [start] => 10:00
                            [end] => 11:00
                        )
                )
        )
    [2] => Array
        (
            [name] => John
            [surname] => Doe
            [docent] => Array
                (
                    [0] => Array
                        (
                            [start] => 09:00
                            [end] => 10:00
                        )
                )
        )
)

Примечание. Необходимо изменить имена полей (как start должно быть start_at) согласно вашей базе данных.

Надеюсь, это будет работать для вас.

0 голосов
/ 29 апреля 2020

Вы можете удалить дубликаты элементов следующим образом

$done = array(); //checked ids
$output = array(); //final result
$n = 0;

foreach($result as $key){
   $key->start = array($key->start);
   $key->end = array($key->end);

   if(!in_array($key->id, $done){
       foreach(array_slice($n+1,$result) as $val){ //getting next part of the array
            if($val->id == $key->id){
                 $key->start[] = $val->start;
                 $key->end[] = $val->end;
            }
       }
       $output[] = $key;
   }
   $n++;
}

print_r($output)

Вывод должен быть

(2) [{…}, {…}]
0: {id: "1", name: "name1", surname: "surname1", date: "2020-05-29", start: ["09:00:00", "10:00:00"], end: ["10:00:00","11:00:00"]}
1: {id: "2", name: "name2", surname: "surname2", date: "2020-05-29", start: ["09:00:00"], end: ["10:00:00"]}
length: 2
__proto__: Array(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...