<?php namespace App\Casts; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Database\Eloquent\Model; class CompressedString implements CastsAttributes { /** * Cast the given value. * * For postgresl bytea columns the value is a resource stream * * @param Model $model * @param string $key * @param mixed $value * @param array $attributes * @return string */ public function get($model,string $key,mixed $value,array $attributes): string { // For stream resources, we to fseek in case we've already read it. if (is_resource($value)) fseek($value,0); $value = is_resource($value) ? stream_get_contents($value) : $value; return $value ? zstd_uncompress(base64_decode($value)) : ''; } /** * Prepare the given value for storage. * * @param Model $model * @param string $key * @param mixed $value * @param array $attributes * @return string */ public function set($model,string $key,$value,array $attributes): string { return $value ? base64_encode(zstd_compress($value)) : ''; } }