diff --git a/app/Models/Filters/KeywordFilter.php b/app/Models/Filters/KeywordFilter.php new file mode 100644 index 0000000..c773455 --- /dev/null +++ b/app/Models/Filters/KeywordFilter.php @@ -0,0 +1,17 @@ +where('name','like', '%'.$name.'%') + ->orWhere('key','like', '%'.$name.'%'); + } +} diff --git a/app/Providers/QueryLoggerServiceProvider.php b/app/Providers/QueryLoggerServiceProvider.php new file mode 100644 index 0000000..f7c1c0a --- /dev/null +++ b/app/Providers/QueryLoggerServiceProvider.php @@ -0,0 +1,67 @@ +app['events']->listen([ + QueryExecuted::class, + TransactionBeginning::class, + TransactionCommitted::class, + TransactionRolledBack::class, + ], function ($event) { + Log::debug(match (true) { + $event instanceof TransactionBeginning => 'begin transaction', + $event instanceof TransactionCommitted => 'commit transaction', + $event instanceof TransactionRolledBack => 'rollback transaction', + default => $this->prepareSql($event), + }); + }); + } + + /** + * @param \Illuminate\Database\Events\QueryExecuted $query + * @return string + */ + protected function prepareSql(QueryExecuted $query): string + { + $sql = str_replace(['%', '?'], ['%%', '%s'], $query->sql); + + $bindings = $query->connection->prepareBindings($query->bindings); + + if (count($bindings)) { + $sql = vsprintf($sql, array_map([$query->connection->getPdo(), 'quote'], $bindings)); + } + + return sprintf('[%s] %s', $this->formatDuration($query->time), $sql); + } + + /** + * @param float $milliseconds + * @return string + */ + protected function formatDuration($milliseconds): string + { + return match (true) { + $milliseconds >= 1000 => round($milliseconds / 1000, 2).'s', + $milliseconds < 0.01 => round($milliseconds * 1000).'μs', + default => $milliseconds.'ms', + }; + } +} diff --git a/app/Services/Admin/BaseService.php b/app/Services/Admin/BaseService.php index 92665ed..a9ec1eb 100644 --- a/app/Services/Admin/BaseService.php +++ b/app/Services/Admin/BaseService.php @@ -16,8 +16,9 @@ class BaseService extends AdminService public function getTree() { - $list = $this->query()->orderByDesc('sort')->get()->toArray(); - return array2tree($list); + $list = $this->query()->orderByDesc('sort')->get(); + $minNum = $list->min('parent_id'); + return array2tree($list->toArray(), $minNum); } public function getModelFilter() diff --git a/app/Services/Admin/KeywordService.php b/app/Services/Admin/KeywordService.php index d0829c6..5143832 100644 --- a/app/Services/Admin/KeywordService.php +++ b/app/Services/Admin/KeywordService.php @@ -4,6 +4,7 @@ namespace App\Services\Admin; use Illuminate\Support\Arr; use App\Models\Keyword; +use App\Models\Filters\KeywordFilter; /** * @method Keyword getModel() @@ -12,6 +13,14 @@ use App\Models\Keyword; class KeywordService extends BaseService { protected string $modelName = Keyword::class; + protected string $modelFilterName = KeywordFilter::class; + + public function getTree() + { + $list = $this->query()->filter(request()->all(), $this->modelFilterName)->orderByDesc('sort')->get(); + $minNum = $list->min('parent_id'); + return array2tree($list->toArray(), $minNum); + } public function parentIsChild($id, $pid): bool { diff --git a/config/app.php b/config/app.php index d99cd37..c832441 100644 --- a/config/app.php +++ b/config/app.php @@ -168,6 +168,8 @@ return [ // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + + App\Providers\QueryLoggerServiceProvider::class, ])->toArray(), /*