anourvalar/eloquent-serialize
Serialize and restore Laravel Eloquent QueryBuilder instances. Save complex queries (with relations, where clauses, limits, etc.) to an array/package and later unserialize back into a builder to run the query again. Supports Laravel 6–12.
Strengths:
with(), where(), orderBy(), and pagination, minimizing refactoring for existing codebases.Weaknesses:
users.id to users.user_id) requires manual handling.Key Synergies:
EloquentSerialize::serialize() and unserialize() require no model changes, enabling quick integration.Serializer to handle custom query types (e.g., polymorphic relationships or global scopes).whereIn() with runtime values).| Risk | Impact | Mitigation |
|---|---|---|
| Schema drift | Query failures or silent errors | Implement pre-execution schema validation (e.g., check column existence via Schema::hasColumn()). |
| Unsupported query features | Partial serialization or failures | Document limitations; extend the package for custom needs (e.g., handle global scopes via withoutGlobalScopes()). |
| Performance degradation | Increased latency or timeouts | Benchmark serialization overhead; cache serialized queries in Redis/Memcached. Limit use for real-time paths. |
| Security vulnerabilities | SQL injection (theoretical) | Sanitize unserialized queries; ensure the package handles this (verify by testing with malicious input). |
| Laravel version incompatibility | Breaking changes | Use container binding for version flexibility or test thoroughly across supported Laravel versions (6–12). |
| Complex relationships | Serialization failures | Test with nested with() clauses; extend the serializer for polymorphic or custom relationships. |
Schema Stability:
Use Case Criticality:
Alternatives:
remember()) or query result caching (e.g., Redis) suffice for simpler use cases?Scalability:
with() clauses or deeply nested relationships)?Team Expertise:
Monitoring and Observability:
Long-Term Maintenance:
Laravel Native Support:
with()), and query methods (where(), orderBy(), paginate()).Model::query() but not raw DB::table() queries. Requires wrapping in an Eloquent model.Queue::push(ProcessSerializedQuery::class, ['query' => $serializedQuery])).Cache::remember('serialized_query_key', now()->addHours(1), fn() => EloquentSerialize::serialize(...))).Scout::search($serializedQuery)).Compatibility:
Phase 1: Proof of Concept (PoC)
composer require anourvalar/eloquent-serialize).$serialized = EloquentSerialize::serialize(User::with('orders')->where('active', true));
Cache::put('active_users_query', $serialized, now()->addMinutes(30));
$builder = EloquentSerialize::unserialize(Cache::get('active_users_query'));
$users = $builder->get();
Phase 2: Broad Integration
class QuerySerializerService {
public function serializeAndCache(Builder $query, string $key, int $ttl) {
$serialized = EloquentSerialize::serialize($query);
Cache::put($key, $serialized, now()->addMinutes($ttl));
return $serialized;
}
}
Queue::push(ExecuteSerializedQuery::class, [
'serializedQuery' => $serialized,
'tenantId' => $tenantId
]);
class ValidateSerializedQuery implements Middleware {
public function handle($request, Closure $next) {
$serialized = $request->serializedQuery;
$builder = EloquentSerialize::unserialize($serialized);
// Validate schema (e.g., check table/column existence)
if (!$this->schemaValid($builder)) {
abort(500, 'Invalid serialized query');
}
return $
How can I help you explore Laravel packages today?