laravel-database-optimization — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited laravel-database-optimization (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Comprehensive database optimization guide for Laravel 13 applications. Contains 33 rules across 9 categories for writing performant database queries, proper indexing, efficient caching, naming conventions, and debugging slow queries in Laravel 13.
Reference these guidelines when:
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Query Performance & N+1 | CRITICAL | query- |
| 2 | Indexing Strategies | CRITICAL | index- |
| 3 | Eloquent Optimization | HIGH | eloquent- |
| 4 | Caching with Redis | HIGH | cache- |
| 5 | Pagination & Large Datasets | HIGH | data- |
| 6 | Transactions & Locking | HIGH | lock- |
| 7 | Migrations | HIGH | migrate- |
| 8 | Query Debugging | MEDIUM | debug- |
| 9 | Naming & Structure | HIGH | naming- |
query-eager-loading - Use eager loading to eliminate N+1 queriesquery-prevent-lazy-loading - Prevent lazy loading in developmentquery-auto-eager-loading - Configure automatic eager loading on modelsquery-select-columns - Select only needed columns instead of SELECT *index-foreign-keys - Index all foreign key columnsindex-composite-indexes - Create composite indexes for multi-column queriesindex-covering-indexes - Use covering indexes for read-heavy queriesindex-full-text - Use full-text indexes for search functionalityeloquent-query-builder-hot-paths - Use query builder for performance-critical pathseloquent-with-count-aggregates - Use withCount instead of loading relations to counteloquent-subquery-selects - Use subquery selects to avoid extra querieseloquent-where-has-optimization - Optimize whereHas with whereIn subqueriescache-remember - Use Cache::remember for expensive queriescache-invalidation - Invalidate cache on model changescache-tags - Use cache tags for group invalidationcache-ttl - Set appropriate TTL values for cached datadata-cursor-pagination - Use cursor pagination for large datasetsdata-chunk-by-id - Process large datasets with chunkByIddata-cursor-iteration - Use lazy cursors for memory-efficient iterationdata-avoid-unbounded - Never use unbounded queries on large tableslock-short-transactions - Keep transactions short and focusedlock-deadlock-retry - Implement deadlock retry logiclock-pessimistic-locking - Use pessimistic locking for critical updatesmigrate-zero-downtime - Write zero-downtime migrationsmigrate-concurrent-indexes - Create indexes concurrently in productionmigrate-safe-column-additions - Add columns safely without locking tablesdebug-explain-analyze - Use EXPLAIN ANALYZE to understand query plansdebug-laravel-debugbar - Use Laravel Debugbar to find query bottlenecksdebug-slow-query-log - Enable and monitor slow query logsnaming-tables - Table naming conventions (plural snake_case, pivot alphabetical)naming-columns - Column naming conventions (FKs, booleans, timestamps, polymorphic)naming-relationships - Relationship method naming (singular/plural matching)naming-migrations - Migration and index naming conventions<?php
namespace App\Providers;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
Model::preventLazyLoading(!app()->isProduction());
}
}<?php
use Illuminate\Support\Facades\Cache;
// Cache a query result for 1 hour (3600 seconds)
$popularPosts = Cache::remember('posts:popular', 3600, fn () =>
Post::query()
->withCount('comments')
->orderByDesc('comments_count')
->take(10)
->get()
);<?php
// Cursor pagination — efficient for infinite scroll and large tables
$posts = Post::query()
->where('published_at', '<=', now())
->orderByDesc('published_at')
->cursorPaginate(15);<?php
// Instead of loading all posts just to count them
$users = User::withCount('posts')->get();
foreach ($users as $user) {
echo "{$user->name} has {$user->posts_count} posts";
}<?php
// Memory-efficient processing of large tables
User::query()
->where('last_login_at', '<', now()->subYear())
->chunkById(1000, function ($users) {
foreach ($users as $user) {
$user->update(['status' => 'inactive']);
}
});<?php
use Illuminate\Support\Facades\DB;
// Keep transactions short and focused
DB::transaction(function () {
$order = Order::create([
'user_id' => auth()->id(),
'total' => $this->calculateTotal(),
]);
$order->items()->createMany($this->cartItems());
$order->user->decrement('credits', $order->total);
});Read individual rule files for detailed explanations and code examples:
rules/query-eager-loading.md
rules/index-composite-indexes.md
rules/cache-remember.md
rules/_sections.mdEach rule file contains:
For the complete guide with all rules expanded: AGENTS.md
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.