feat: implement MySQL database driver and API service for schema management and data operations
This commit is contained in:
@@ -22,12 +22,12 @@ interface DatabaseDriverInterface
|
||||
/**
|
||||
* Get table data.
|
||||
*/
|
||||
public function getTableData(string $table, int $limit = 100, int $offset = 0): array;
|
||||
public function getTableData(string $table, int $limit = 100, int $offset = 0, array $filters = []): array;
|
||||
|
||||
/**
|
||||
* Get the count of rows in a table.
|
||||
*/
|
||||
public function getTableCount(string $table): int;
|
||||
public function getTableCount(string $table, array $filters = []): int;
|
||||
|
||||
/**
|
||||
* Get the underlying connection instance.
|
||||
|
||||
@@ -68,15 +68,16 @@ class SchemaController extends Controller
|
||||
|
||||
$skip = $request->get('skip', 0);
|
||||
$take = $request->get('take', 100);
|
||||
$filters = json_decode($request->get('filters', '[]'), true);
|
||||
|
||||
$data = $this->databaseService->getTableData($table, $take, $skip);
|
||||
$data = $this->databaseService->getTableData($table, $take, $skip, $filters);
|
||||
|
||||
$response = [
|
||||
'data' => $data,
|
||||
];
|
||||
|
||||
if ($request->get('requireTotalCount') === 'true') {
|
||||
$response['totalCount'] = $this->databaseService->getTableCount($table);
|
||||
$response['totalCount'] = $this->databaseService->getTableCount($table, $filters);
|
||||
}
|
||||
|
||||
return Response::json($response);
|
||||
|
||||
@@ -64,15 +64,68 @@ class MySqlDriver implements DatabaseDriverInterface, SchemaDiscoveryInterface
|
||||
return $this->query("DESCRIBE `{$table}`");
|
||||
}
|
||||
|
||||
public function getTableData(string $table, int $limit = 100, int $offset = 0): array
|
||||
public function getTableData(string $table, int $limit = 100, int $offset = 0, array $filters = []): array
|
||||
{
|
||||
return $this->query("SELECT * FROM `{$table}` LIMIT ? OFFSET ?", [$limit, $offset]);
|
||||
$query = DB::connection($this->connectionName)->table($table);
|
||||
$this->applyFilters($query, $filters);
|
||||
return $query->limit($limit)->offset($offset)->get()->all();
|
||||
}
|
||||
|
||||
public function getTableCount(string $table): int
|
||||
public function getTableCount(string $table, array $filters = []): int
|
||||
{
|
||||
$result = $this->query("SELECT COUNT(*) as count FROM `{$table}`");
|
||||
return (int) ($result[0]->count ?? 0);
|
||||
$query = DB::connection($this->connectionName)->table($table);
|
||||
$this->applyFilters($query, $filters);
|
||||
return $query->count();
|
||||
}
|
||||
|
||||
protected function applyFilters($query, array $filters)
|
||||
{
|
||||
if (empty($filters)) return $query;
|
||||
|
||||
foreach ($filters as $filter) {
|
||||
$field = $filter['field'] ?? ($filter['columnField'] ?? null);
|
||||
$operator = $filter['operator'] ?? ($filter['operatorValue'] ?? null);
|
||||
$value = $filter['value'] ?? null;
|
||||
|
||||
if (!$field) continue;
|
||||
|
||||
switch ($operator) {
|
||||
case 'contains':
|
||||
$query->where($field, 'LIKE', "%{$value}%");
|
||||
break;
|
||||
case 'equals':
|
||||
case '=':
|
||||
$query->where($field, '=', $value);
|
||||
break;
|
||||
case 'startsWith':
|
||||
$query->where($field, 'LIKE', "{$value}%");
|
||||
break;
|
||||
case 'endsWith':
|
||||
$query->where($field, 'LIKE', "%{$value}");
|
||||
break;
|
||||
case 'isEmpty':
|
||||
$query->where(function($q) use ($field) {
|
||||
$q->whereNull($field)->orWhere($field, '');
|
||||
});
|
||||
break;
|
||||
case 'isNotEmpty':
|
||||
$query->whereNotNull($field)->where($field, '!=', '');
|
||||
break;
|
||||
case 'isAnyOf':
|
||||
if (is_array($value)) {
|
||||
$query->whereIn($field, $value);
|
||||
}
|
||||
break;
|
||||
case '>':
|
||||
case '<':
|
||||
case '>=':
|
||||
case '<=':
|
||||
case '!=':
|
||||
$query->where($field, $operator, $value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $query;
|
||||
}
|
||||
|
||||
public function getForeignKeys(string $table): array
|
||||
|
||||
@@ -78,17 +78,17 @@ class DatabaseService
|
||||
/**
|
||||
* Get table data.
|
||||
*/
|
||||
public function getTableData(string $table, int $limit = 100, int $offset = 0): array
|
||||
public function getTableData(string $table, int $limit = 100, int $offset = 0, array $filters = []): array
|
||||
{
|
||||
return $this->getDriver()->getTableData($table, $limit, $offset);
|
||||
return $this->getDriver()->getTableData($table, $limit, $offset, $filters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get table row count.
|
||||
*/
|
||||
public function getTableCount(string $table): int
|
||||
public function getTableCount(string $table, array $filters = []): int
|
||||
{
|
||||
return $this->getDriver()->getTableCount($table);
|
||||
return $this->getDriver()->getTableCount($table, $filters);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user