projek-xyz/slim-framework

View on GitHub
src/Database/Results.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace Projek\Slim\Database;

use Slim\PDO\Statement\SelectStatement;

class Results implements \Countable
{
    /**
     * @var  mixed
     */
    protected $statement;

    /**
     * @var  string
     */
    protected $query;

    /**
     * @var  array
     */
    protected $params;

    /**
     * @var  \PDOStatement
     */
    protected $results;

    /**
     * @var  string
     */
    protected $model;

    /**
     * @param  SelectStatement $statement
     * @param  string $model
     */
    public function __construct(SelectStatement $statement, $model = '')
    {
        /** @var  SelectStatement $statement */
        $this->statement = $statement;
        $this->query = $statement->compile();
        $this->model = $model;
    }

    /**
     * @param  int|null $limit
     * @param  int|null $offset
     *
     * @return \PDOStatement
     */
    protected function fetch($limit = null, $offset = null)
    {
        if (is_int($limit)) {
            $this->statement->limit($limit, $offset);
        }

        $statement = $this->statement->execute();

        if ($this->model instanceof Models) {
            $statement->setFetchMode(\PDO::FETCH_INTO, $this->model);
        } else {
            $statement->setFetchMode(\PDO::FETCH_CLASS|\PDO::FETCH_PROPS_LATE, $this->model);
        }

        return $statement;
    }

    /**
     * @return Models
     */
    public function get()
    {
        return $this->fetch()->fetch();
    }

    /**
     * @return array
     */
    public function all()
    {
        $this->results = $this->fetch();

        return $this->results->fetchAll();
    }

    /**
     * @param  int|null $limit
     * @param  int|null $offset
     *
     * @return array
     */
    public function limit($limit = null, $offset = null)
    {
        $this->results = $this->fetch($limit, $offset);

        return $this->results->fetchAll();
    }

    /**
     * @return int
     */
    public function count()
    {
        if (!$this->results) {
            $this->results = $this->fetch();
        }

        return $this->results->rowCount();
    }
}