Ir para conteúdo
Fórum Script Brasil
  • 0

Projeto semiLaravel, introduzindo o operador BETWEEN na classe bd


Frank K Hosaka

Pergunta

Hoje o dia foi bem complicado, pedi para o Copilot me ajudar com o operador BETWEEN, e ele introduziu o conceito de depurador, e a partir daí acabei me desentendo com o Copilot.

Pensei que o meu problema era a gambiarra que eu fiz no autoload, então decidi tentar introduzir o BETWEEN sem a ajuda do Copilot.

O depurador do Copilot é assim: echo $sql. Eu não entendi o que estava acontecendo. Mas mudei o código assim: echo $sql."<br>"; e tudo fez sentido, e foi justamente com a ajuda do depurador é que consegui introduzir o BETWEEN na classe bd.

Quanto ao autoload, eu trouxe a versão original. Já a classe das tabelas ficou assim class tbdiario extends bd { }. No meio de tanta confusão, acabei gostando da função getTableName na classe bd, ele é capaz de saber o nome da tabela que foi invocada, e o VS Code não reclama que a classe tabela está ausente. O código seguinte vai executar esse tipo de consulta:

$debitos=array_column(tbdiario::groupBy('contad')
            ->select(['contad','sum(valor) as debito'],
            [['dia','BETWEEN',[$primeiroDia,$ultimoDia]]]),'debito','contad');


 

listagem parcial do arquivo config.php
spl_autoload_register(function ($class) {
    $path = str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php';
    if (file_exists($path)) {
        require $path;
    } else {
        echo "classe $class não encontrada";
        exit;
    }
});

class bd {
    private static $pdo;
    private static $initialized = false;
    private static $orderBy = '';
    private static $groupBy = '';
    private static $bindings = [];

    static function initialize() {
        if (!self::$initialized) {
            $dsn = 'mysql:host=' . HOST . ';dbname=' . DBNAME;
            self::$pdo = new PDO($dsn, USER, PASSWORD);
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            self::$initialized = true;
        }
    }

    protected static function getPdo() {
        self::initialize();
        return self::$pdo;
    }

    protected static function getTableName() {
        $reflection = new \ReflectionClass(static::class);
        return strtolower($reflection->getShortName());
    }

    public static function orderBy($column, $direction = 'ASC') {
        self::$orderBy = "ORDER BY $column $direction";
        return new static;
    }

    // Adicionando o método groupBy
    public static function groupBy($columns) {
        if (is_array($columns)) {
            $columns = implode(', ', $columns);
        }
        self::$groupBy = "GROUP BY $columns";
        return new static;
    }

    public static function select($columns = '*', $conditions = []) {
        self::initialize();
        $table = static::getTableName();
        if (is_array($columns)) {
            $columns = implode(', ', $columns);
        }
        $whereClause = '';
        self::$bindings=[];
        if (!empty($conditions)) {
            foreach ($conditions as $condition) {
                $field = $condition[0];
                $operator = $condition[1];
                $value = $condition[2];
                if($operator=='BETWEEN' && is_array($value)) {
                    $whereClause .= "$field BETWEEN :{$field}_start AND :{$field}_end AND ";
                    self::$bindings["{$field}_start"] = $value[0];
                    self::$bindings["{$field}_end"] = $value[1];    
                } else {
                    $whereClause .= "$field $operator :$field AND ";
                    self::$bindings[$field] = $value;
                }                
            }
            $whereClause = 'WHERE ' . rtrim($whereClause, ' AND ');
        }
        $sql = "SELECT $columns FROM $table $whereClause";
        if (self::$groupBy) {
            $sql .= ' ' . self::$groupBy;
            self::$groupBy = ''; // Reset groupBy after use
        }
        if (self::$orderBy) {
            $sql .= ' ' . self::$orderBy;
            self::$orderBy = ''; // Reset orderBy after use
        }
        // echo $sql."<br>"; // depurador
        $stmt = self::getPdo()->prepare($sql);
        foreach (self::$bindings as $key => $value) {
                $stmt->bindValue(":$key", $value);
        }
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_OBJ);
    }
}
 
class tbconta extends bd { }
class tbdiario extends bd { }
class tbusuarios extends bd { }

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,1k
×
×
  • Criar Novo...