Your IP : 216.73.216.229


Current Path : /home/jeromecohp/www/plugins/system/yooessentials/modules/core-joomla/src/
Upload File :
Current File : /home/jeromecohp/www/plugins/system/yooessentials/modules/core-joomla/src/DatabaseQuery.php

<?php
/**
 * @package   Essentials YOOtheme Pro (Freemium) 2.0.19 build 1026.0920
 * @author    ZOOlanders https://www.zoolanders.com
 * @copyright Copyright (C) Joolanders, SL
 * @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
 */

namespace ZOOlanders\YOOessentials\Joomla;

use Joomla\CMS\Factory;
use YOOtheme\Arr;
use ZOOlanders\YOOessentials\Database\Database;

class DatabaseQuery implements \ZOOlanders\YOOessentials\Database\DatabaseQuery
{
    /**
     * @var Database|\JDatabaseDriverMysqli
     */
    protected $db;

    /**
     * @var \JDatabaseQuery
     */
    protected $query;
    protected $offset = 0;
    protected $limit = 20;

    public function __construct(Database $db)
    {
        $this->db = $db;
        $this->query = Factory::getDbo()->getQuery(true);
    }

    public function createForDatabase(Database $database): \ZOOlanders\YOOessentials\Database\DatabaseQuery
    {
        return new DatabaseQuery($database);
    }

    public function __call($name, $arguments)
    {
        call_user_func_array([$this->db, $name], $arguments);

        return $this;
    }

    public function select($fields = '*'): \ZOOlanders\YOOessentials\Database\DatabaseQuery
    {
        $this->query->select($fields);

        return $this;
    }

    public function from($table): \ZOOlanders\YOOessentials\Database\DatabaseQuery
    {
        $this->query->from($table);

        return $this;
    }

    public function leftJoin(
        $table,
        $firstColumn,
        $operator = '=',
        $secondColumn = null
    ): \ZOOlanders\YOOessentials\Database\DatabaseQuery {
        $this->query->leftJoin("{$table} ON {$firstColumn} {$operator} {$secondColumn}");

        return $this;
    }

    public function where($column, $operator = '=', $value = null): \ZOOlanders\YOOessentials\Database\DatabaseQuery
    {
        $this->query->where("{$column} {$operator} {$value}");

        return $this;
    }

    public function whereRaw($query, $glue = 'AND'): \ZOOlanders\YOOessentials\Database\DatabaseQuery
    {
        if (strtoupper($glue) === 'OR') {
            $this->query->orWhere($query, $glue);

            return $this;
        }

        $this->query->where($query, $glue);

        return $this;
    }

    public function whereIn($column, $values): \ZOOlanders\YOOessentials\Database\DatabaseQuery
    {
        $values = implode(',', Arr::wrap($values));
        $this->query->where("{$column} IN ( {$values} )");

        return $this;
    }

    public function limit($limit): \ZOOlanders\YOOessentials\Database\DatabaseQuery
    {
        $this->limit = $limit;

        return $this;
    }

    public function offset($offset): \ZOOlanders\YOOessentials\Database\DatabaseQuery
    {
        $this->offset = $offset;

        return $this;
    }

    public function get(): array
    {
        return $this->db->fetchAll((string) $this);
    }

    public function orderBy(string $field, string $direction = 'ASC'): \ZOOlanders\YOOessentials\Database\DatabaseQuery
    {
        $this->query->order($field . ' ' . $direction);

        return $this;
    }

    public function __toString()
    {
        return (string) $this->query . " LIMIT {$this->offset}, {$this->limit}";
    }
}