Я опоздал на вечеринку, но этим важно поделиться ...
По поводу вашей ошибки, похоже, вы забыли объявить набор результатов в 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);