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 { }
Pergunta
Frank K Hosaka
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');
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
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.