protected function executeGetContentQueries($decoded)
{
// Perform actual queries and hydrate
$totalResults = false;
$results = false;
foreach ($decoded['queries'] as $query) {
$statement = sprintf('SELECT %s.* %s %s %s', $query['tablename'], $query['from'], $query['where'], $query['order']);
if ($decoded['self_paginated'] === true) {
// self pagination requires an extra query to return the actual number of results
if ($decoded['return_single'] === false) {
$countStatement = sprintf('SELECT COUNT(*) as count %s %s', $query['from'], $query['where']);
$countRow = $this->app['db']->executeQuery($countStatement)->fetch();
$totalResults = $countRow['count'];
}
if (isset($decoded['parameters']['paging']) && $decoded['parameters']['paging'] === true) {
$offset = ($decoded['parameters']['page'] - 1) * $decoded['parameters']['limit'];
} else {
$offset = null;
}
$limit = $decoded['parameters']['limit'];
// @todo this will fail when actually using params on certain databases
$statement = $this->app['db']->getDatabasePlatform()->modifyLimitQuery($statement, $limit, $offset);
} elseif (!empty($decoded['parameters']['limit'])) {
// If we're not paging, but we _did_ provide a limit.
$limit = $decoded['parameters']['limit'];
$statement = $this->app['db']->getDatabasePlatform()->modifyLimitQuery($statement, $limit);
}
if (!empty($decoded['parameters']['printquery'])) {
// @todo formalize this
echo nl2br(htmlentities($statement));
}
$rows = $this->app['db']->fetchAll($statement, $query['params']);
// Convert the row 'arrays' into \Bolt\Legacy\Content objects.
// Only get the Taxonomies and Relations if we have to.
$rows = $this->hydrateRows($query['contenttype'], $rows, $decoded['hydrate']);
if ($results === false) {
$results = $rows;
} else {
// We can no longer maintain keys when merging subresults
$results = array_merge($results, array_values($rows));
}
}
if ($totalResults === false) {
$totalResults = count($results);
}
return [$results, $totalResults];
}