На данный момент я получаю записи из БД, используя DBAL а затем я преобразую каждую строку в соответствующий объект. Каждый объект добавляется в массив и, наконец, это преобразован в json с помощью функции json ().
Пример кода:
class MyController extends BaseController {
public function getById(Request $request, Application $app, $id) {
$this->app = $app;
$sql = "SELECT * FROM table ...";
$stmt = $app['db']->prepare($sql);
$stmt->execute();
$obj = $stmt->fetchAll(\PDO::FETCH_ASSOC);
return $app->json($this->convert($obj));
}
public function convert($resultset) {
$result = array();
foreach ($resultset as $key => $row) {
$myObj = new MyObj();
$myObj->setId($row['id']);
// and so on
}
return $result;
}
}
Можно ли изменить этот метод сериализации, чтобы он был быстрее? Положите дело, я должен отправить клиент REST сто тысяч предметов, есть своего рода режим streming, как для файлов так что я могу избежать буферизации всех результатов во временном массиве?
Спасибо
Если ваши свойства класса отображаются на имена столбцов в базе данных, вы можете получить объекты напрямую, используя PDO::FETCH_CLASS
, Это не даст вам никакой потоковой передачи, но пропустит весь этап конвертации:
public function getById(Request $request, Application $app, $id) {
$this->app = $app;
$sql = "SELECT * FROM table ...";
$stmt = $app['db']->prepare($sql);
$stmt->execute();
// Generate an array of the required objects
$arr = $stmt->fetchAll(\PDO::FETCH_CLASS, "MyObj");
// Encode the array
return $app->json($arr);
}
Других решений пока нет …