Как использовать повторяющиеся MySQL запросы и формировать json кодированный результат? - PullRequest
0 голосов
/ 15 апреля 2020

У меня проблема при выполнении нескольких SQL в массиве и последующем отображении в JSON данных, это мой код:

$sql0="SELECT id,
              company_id,
              class_name
       FROM cc_class_room
       WHERE company_id='CO191125310002'";

$res=$this->db->query($sql0);
$data=$res->result_array();

$i=0;

foreach($data as $row ) {
    $sql1="SELECT COUNT(user_id) member FROM cc_class_room_user WHERE class_id='".$row['company_id']."' GROUP BY class_id";
    $res1=$this->db->query($sql1);

    $responce->rows[$i]['id']=$row['id'];
    $responce->rows[$i]['cell']=array("company_id"=>$row['company_id'],"class_name"=>$row['class_name'],"member"=>$row['member']);
    $i++;
}

return json_encode($responce);

Когда я это сделал, я получил ошибку:

Неопределенный индекс: member

Второй SQL не может быть выполнен, как мне выполнить sql для массива, без объединения / объединения SQL? Это отображение JSON, которое я хочу json

Это приложение, построенное на CodeIgniter.

Ответы [ 2 ]

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

Вы не получили значение member из второго запроса. Вам нужно извлечь это в другой массив, чтобы вы могли добавить его к своим выходным данным:

foreach($data as $row ) {
    $sql1="SELECT COUNT(user_id) member FROM cc_class_room_user WHERE class_id='".$row['company_id']."'";
    $res1=$this->db->query($sql1);
    $row1=$res1->result_array();
    $responce->rows[$i]['id']=$row['id'];
    $responce->rows[$i]['cell']=array("company_id"=>$row['company_id'],"class_name"=>$row['class_name'],"member"=>$row1[0]['member']);
    $i++;
}   

Обратите внимание, что вам не нужно использовать счетчик в вашем l oop, вы можете поместить все данные вместе в массиве и pu sh это в одну строку:

$responce[] = array('id' => $row['id'],
                    'cell' => array("company_id" => $row['company_id'],
                                    "class_name"=>$row['class_name'],
                                     "member"=>$row1[0]['member']
                                   )
                    );
1 голос
/ 15 апреля 2020

Я опоздал на вечеринку, но этим важно поделиться ...

По поводу вашей ошибки, похоже, вы забыли объявить набор результатов в l oop, как вы это сделали для $data перед l oop.

$res1=$this->db->query($sql1);  // $res1 is never used again!

Вы могли бы просто записать счет непосредственно в новую структуру данных, например:

'member' => $res1->getRowArray['member']

Вы должны не делайте повторных поездок на сервер, когда вы можете выполнить всю работу за одну поездку. Вы можете использовать подзапрос в предложении SELECT - он будет выполнять столько же отдельных запросов к таблицам, сколько и в исходном скрипте, но он делает все это за одну поездку. Это лучшая практика, и ваш учитель не должен говорить вам иначе.

Кроме того, поскольку вы пишете свое приложение в CodeIgniter, вы должны полностью принять синтаксис активной записи. Если ваше входящее значение company_id предоставлено пользователем, то следующий фрагмент фактически поможет вам написать стабильный, безопасный и переносимый запрос.

Raw MySQL SELECT с подзапросом: ( db -fiddle.com demo )

SELECT id,
       class_name,
       (SELECT COUNT(1)
        FROM cc_class_room_user
        WHERE class_id = company_id) AS members
FROM cc_class_room
WHERE company_id = 'CO191125310002'

SELECT с подзапросом через активную запись CodeIgniter:
(я проверил это локально, чтобы быть успешным / заслуживающим доверия)

$companyId = 'CO191125310002';

$subquery = $this->db
    ->select('COUNT(1)')
    ->from('cc_class_room_user')
    ->where('class_id = company_id')
    ->get_compiled_select();

$resultSet = $this->db
    ->select("id, class_name, ({$subquery}) AS members")
    ->from('cc_class_room')
    ->where('company_id', $companyId)
    ->get()
    ->result_array();

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


Неважно каким образом вы выбираете запрос к базе данных, подготовка ваших результатов, IMO, наиболее четко написана так:

$results = [];
foreach ($resultSet as $row) {
    $results[] = [
        'id' => $row['id'],
        'cell' => [
            'company_id' => $companyId,  // no reason to query for what you already know
            'class_name' => $row['class_name'],
            'members' => $row['members'],  // I am using plural because it makes better sense for a counted value
        ],
    ];
}
return json_encode(['rows' => $results], JSON_PRETTY_PRINT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...