Spot\Adapter\PDO\BaseAbstract::read PHP Метод

read() публичный Метод

Build a select statement in SQL Can be overridden by adapters for custom syntax
public read ( Query $query, array $options = [] )
$query Spot\Query
$options array
    public function read(\Spot\Query $query, array $options = array())
    {
        $isCount = false;
        if (isset($options['SPOT_SQL_COUNT']) && $options['SPOT_SQL_COUNT'] === true) {
            $isCount = true;
        }
        $conditions = $this->statementConditions($query->conditions);
        $binds = $this->statementBinds($query->params());
        $order = array();
        if (!$isCount) {
            if ($query->order) {
                foreach ($query->order as $oField => $oSort) {
                    $order[] = $this->escapeField($oField) . " " . $oSort;
                }
            }
        }
        if ($query->having) {
            $havingConditions = $this->statementConditions($query->having, count($binds) - count($query->having));
        }
        $fields = $this->statementFields($query->fields);
        // Prepend COUNT(*) if count query
        if ($isCount && !empty($fields)) {
            // Remove field wildcard '*' because it will cause errors with COUNT
            $aFields = explode(',', $fields);
            $fields = implode(',', array_filter($aFields, function ($r) {
                return trim($r) != '*';
            }));
            $fields = "COUNT(*) as count" . ($fields ? ', ' . $fields : '');
        }
        $sql = "\n            SELECT " . $fields . "\n            FROM " . $query->datasource . "\n            " . ($conditions ? 'WHERE ' . $conditions : '') . "\n            " . ($query->group ? 'GROUP BY ' . implode(', ', $query->group) : '') . "\n            " . ($query->having ? 'HAVING' . $havingConditions : '') . "\n            " . ($order ? 'ORDER BY ' . implode(', ', $order) : '') . "\n            " . (!$isCount ? ($query->limit ? 'LIMIT ' . $query->limit : '') . " " . ($query->limit && $query->offset ? 'OFFSET ' . $query->offset : '') : '') . "\n            ";
        // 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
        \Spot\Log::addQuery($this, $sql, $binds);
        $result = false;
        try {
            // Prepare update query
            $stmt = $this->connection()->prepare($sql);
            if ($stmt) {
                // Execute
                if ($stmt->execute($binds)) {
                    if (isset($options['SPOT_SQL_COUNT'])) {
                        //the count is returned in the first column
                        $result = (int) $stmt->fetchColumn();
                    } else {
                        $result = $this->toCollection($query, $stmt);
                    }
                } else {
                    $result = false;
                }
            } else {
                $result = false;
            }
        } catch (\PDOException $e) {
            // Table does not exist
            if ($e->getCode() == "42S02") {
                throw new \Spot\Exception_Datasource_Missing("Table or datasource '" . $query->datasource . "' does not exist");
            }
            // Re-throw exception
            throw $e;
        }
        return $result;
    }