![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/ts.corals.io/corals-api/Corals/core/Foundation/Classes/Cache/ |
<?php namespace Corals\Foundation\Classes\Cache; use Corals\Foundation\Traits\Cache\CachePrefixing; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Query\Builder; use Illuminate\Support\Collection; class CacheKey { use CachePrefixing; protected $eagerLoad; protected $model; protected $query; public function __construct( array $eagerLoad, Model $model, Builder $query ) { $this->eagerLoad = $eagerLoad; $this->model = $model; $this->query = $query; } public function make( array $columns = ["*"], $idColumn = null, string $keyDifferentiator = "" ): string { $key = $this->getCachePrefix(); $key .= $this->getModelSlug(); $key .= $this->getIdColumn($idColumn ?: ""); $key .= $this->getQueryColumns($columns); $key .= $this->getWhereClauses(); $key .= $this->getWithModels(); $key .= $this->getOrderByClauses(); $key .= $this->getOffsetClause(); $key .= $this->getLimitClause(); $key .= $keyDifferentiator; return $key; } protected function getIdColumn(string $idColumn): string { return $idColumn ? "_{$idColumn}" : ""; } protected function getLimitClause(): string { if (!$this->query->limit) { return ""; } return "-limit_{$this->query->limit}"; } protected function getModelSlug(): string { return \Str::slug(get_class($this->model)); } protected function getOffsetClause(): string { if (!$this->query->offset) { return ""; } return "-offset_{$this->query->offset}"; } protected function getOrderByClauses(): string { $orders = collect($this->query->orders); return $orders ->reduce(function ($carry, $order) { if (($order["type"] ?? "") === "Raw") { return $carry . "_orderByRaw_" . \Str::slug($order["sql"]); } return $carry . "_orderBy_" . $order["column"] . "_" . $order["direction"]; }) ?: ""; } protected function getQueryColumns(array $columns): string { if ($columns === ["*"] || $columns === []) { return ""; } return "_" . implode("_", $columns); } protected function getTypeClause($where): string { $type = in_array($where["type"], ["In", "NotIn", "Null", "NotNull", "between"]) ? strtolower($where["type"]) : strtolower($where["operator"] ?? ''); return str_replace(" ", "_", $type); } protected function getValuesClause(array $where = null): string { if (in_array($where["type"], ["NotNull"])) { return ""; } $values = $this->getValuesFromWhere($where); $values = $this->getValuesFromBindings($values); return "_" . $values; } protected function getValuesFromWhere(array $where): string { return is_array(\Arr::get($where, "values")) ? implode("_", $where["values"]) : ""; } protected function getValuesFromBindings(string $values): string { if (!$values && $this->query->bindings["where"] ?? false) { $values = implode("_", $this->query->bindings["where"]); } return $values; } protected function getWhereClauses(array $wheres = []): string { return $this->getWheres($wheres) ->reduce(function ($carry, $where) { $value = $this->getNestedClauses($where); $value .= $this->getColumnClauses($where); $value .= $this->getRawClauses($where); $value .= $this->getOtherClauses($where, $carry); return $value; }) . ""; } protected function getNestedClauses(array $where): string { if (!in_array($where["type"], ["Exists", "Nested", "NotExists"])) { return ""; } return "_" . strtolower($where["type"]) . $this->getWhereClauses($where["query"]->wheres); } protected function getColumnClauses(array $where): string { if ($where["type"] !== "Column") { return ""; } return "_{$where["boolean"]}_{$where["first"]}_{$where["operator"]}_{$where["second"]}"; } protected function getRawClauses(array $where): string { if ($where["type"] !== "raw") { return ""; } return "_{$where["boolean"]}_" . \Str::slug($where["sql"]); } protected function getOtherClauses(array $where, string $carry = null): string { if (in_array($where["type"], ["Exists", "Nested", "NotExists", "raw", "Column"])) { return ""; } $value = $this->getTypeClause($where); $value .= $this->getValuesClause($where); return "{$carry}-{$where["column"]}_{$value}"; } protected function getWheres(array $wheres): Collection { $wheres = collect($wheres); if ($wheres->isEmpty()) { $wheres = collect($this->query->wheres); } return $wheres; } protected function getWithModels(): string { $eagerLoads = collect($this->eagerLoad); if ($eagerLoads->isEmpty()) { return ""; } return "-" . implode("-", $eagerLoads->keys()->toArray()); } }