/**
* Build a select statement in SQL
* Can be overridden by adapters for custom syntax
*
* @todo Add support for JOINs
*/
public function read(phpDataMapper_Query $query)
{
$conditions = $this->statementConditions($query->conditions);
$binds = $this->statementBinds($query->params());
$order = array();
if ($query->order) {
foreach ($query->order as $oField => $oSort) {
$order[] = $oField . " " . $oSort;
}
}
$sql = "\n\t\t\tSELECT " . $this->statementFields($query->fields) . "\n\t\t\tFROM " . $query->source . "\n\t\t\t" . ($conditions ? 'WHERE ' . $conditions : '') . "\n\t\t\t" . ($query->group ? 'GROUP BY ' . implode(', ', $query->group) : '') . "\n\t\t\t" . ($order ? 'ORDER BY ' . implode(', ', $order) : '') . "\n\t\t\t" . ($query->limit ? 'LIMIT ' . $query->limit : '') . " " . ($query->limit && $query->limitOffset ? 'OFFSET ' . $query->limitOffset : '') . "\n\t\t\t";
// Unset any NULL values in binds (compared as "IS NULL" and "IS NOT NULL" in SQL instead)
if ($binds && count($binds) > 0) {
foreach ($binds as $field => $value) {
if (null === $value) {
unset($binds[$field]);
}
}
}
// Add query to log
phpDataMapper::logQuery($sql, $binds);
// Prepare update query
$stmt = $this->connection()->prepare($sql);
if ($stmt) {
// Execute
if ($stmt->execute($binds)) {
$result = $this->toCollection($query, $stmt);
} else {
$result = false;
}
} else {
$result = false;
}
return $result;
}