toSql(); // If explicit params were not provided or empty, use the builder's bindings if (empty($params)) { $parameterData = $query->getBindings(); } } else { $sql = (string) $query; } $queryHash = md5($sql); $paramHash = md5(self::serializeParams($parameterData)); return "querycache:{$queryHash}++++{$paramHash}"; } /** * Deep serialization of parameters for hashing. * Supports arrays, objects, and models. */ private static function serializeParams($params): string { if (is_array($params)) { $processed = []; foreach ($params as $key => $value) { $processed[$key] = self::serializeParams($value); } // Sort keys to ensure consistent hashing for the same associative array ksort($processed); return json_encode($processed); } if (is_object($params)) { // Handle models specifically if ($params instanceof Model) { return get_class($params) . ':' . ($params->hashkey ?? $params->id ?? 'new'); } if (method_exists($params, 'toArray')) { return json_encode($params->toArray()); } return get_class($params) . ':' . spl_object_hash($params); } return (string) $params; } }