Ошибка при работе с большим объемом данных
Судя по всему, наткнулся на баг в работе метода getAll.
База данных sqlite. Есть три таблицы - авторы, книги и промежуточная таблица связей между этими таблицами (и с другими таблицами, но пока не используемыми в рамках тестирования). Прежде чем писать модели и адаптировать таблицы, решил протестировать связи прямым запросом:
$rows = $this -> db -> getAll("
SELECT *
FROM responsability
LEFT OUTER JOIN authors
ON responsability.responsability_author = authors.id
LEFT OUTER JOIN notices
ON responsability.responsability_notice = notices.notice_id");
В результате, получаю массив содержащий 11896 из 33510 содержащихся в БД, более того, выведенные данные из таблицы notices не соответствуют указанным связям. Если установить LIMIT к примеру в 500, то по крайней мере первые записи соответствуют, на счет прочих сказать без сравнения сложно.
Проверяю запрос через прямой коннект к базе
$db = new SQLite3('userfiles/database/sqlite/database.sqlite');
Результат выдает полный набор данных, с правильным соответствием между записями. Такое ощущение, что при формировании массива через метод getAll где-то отсекаются данные. Лично мне такой объем выводимой информации не понадобится, и запрос был тестовым, а с ограниченным набором данных судя по всему работает как надо, но пишу, чтобы были в курсе ситуации.
Поправка. Данные связанных таблиц, все же соответствуют, просто начинаются не с первой записи. Первые выведенные записи ввели в заблуждение, т.к. авторы по списку были первыми, но указанные книги в базе далеко дальше. Но суммарное количество выводимых записей все же меньшее.
Метод getAll устроен достаточно просто, он использует только функционал PDO для извлечение данных из БД и помещает их в массив с ключами в виде id записи. Возможно в вашем запросе при использовании JOIN конструкций перезаписались id записей т.к. поле id есть у всех таблиц. Если это так, то при указании имен нужных полей и переименовании дублей полей (id) проблема должна уйти.
public function getAll($query) { $mass = array(); $result = $this -> query($query); while($row = $this -> fetch($result, "ASSOC")) if(isset($row['id'])) $mass[$row['id']] = $row; else $mass[] = $row; return $mass; }
Теперь понятно, в id и кроется проблема. Почему-то использовалась колонка id только одной таблицы, и как бы не менялся запрос, результат был один и тот же. Перенес данную функцию в свой класс, и убрал заполнение массива id, и тогда получил полный массив данных.
public function getAll($query) { $mass = array(); $result = $this -> db -> query($query); while($row = $this -> db -> fetch($result, "ASSOC")) $mass[] = $row; return $mass; }