cc-codeconductor 0.2.10 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/index.js +499 -266
  2. package/package.json +1 -1
  3. package/presets/agy/AGENTS.md +11 -0
  4. package/presets/claude/CLAUDE.md +34 -0
  5. package/presets/claude/skills/android/SKILL.md +119 -0
  6. package/presets/claude/skills/laravel-specialist/SKILL.md +264 -0
  7. package/presets/claude/skills/laravel-specialist/references/eloquent.md +351 -0
  8. package/presets/claude/skills/laravel-specialist/references/livewire.md +512 -0
  9. package/presets/claude/skills/laravel-specialist/references/queues.md +423 -0
  10. package/presets/claude/skills/laravel-specialist/references/routing.md +362 -0
  11. package/presets/claude/skills/laravel-specialist/references/testing.md +522 -0
  12. package/presets/claude/skills/php-pro/SKILL.md +208 -0
  13. package/presets/claude/skills/php-pro/references/async-patterns.md +412 -0
  14. package/presets/claude/skills/php-pro/references/laravel-patterns.md +377 -0
  15. package/presets/claude/skills/php-pro/references/modern-php-features.md +323 -0
  16. package/presets/claude/skills/php-pro/references/symfony-patterns.md +466 -0
  17. package/presets/claude/skills/php-pro/references/testing-quality.md +466 -0
  18. package/presets/codex/AGENTS.md +19 -0
  19. package/presets/codex/skills/android/SKILL.md +119 -0
  20. package/presets/codex/skills/laravel-specialist/SKILL.md +264 -0
  21. package/presets/codex/skills/laravel-specialist/references/eloquent.md +351 -0
  22. package/presets/codex/skills/laravel-specialist/references/livewire.md +512 -0
  23. package/presets/codex/skills/laravel-specialist/references/queues.md +423 -0
  24. package/presets/codex/skills/laravel-specialist/references/routing.md +362 -0
  25. package/presets/codex/skills/laravel-specialist/references/testing.md +522 -0
  26. package/presets/codex/skills/php-pro/SKILL.md +208 -0
  27. package/presets/codex/skills/php-pro/references/async-patterns.md +412 -0
  28. package/presets/codex/skills/php-pro/references/laravel-patterns.md +377 -0
  29. package/presets/codex/skills/php-pro/references/modern-php-features.md +323 -0
  30. package/presets/codex/skills/php-pro/references/symfony-patterns.md +466 -0
  31. package/presets/codex/skills/php-pro/references/testing-quality.md +466 -0
  32. package/presets/opencode/agents/orchestrator.md +121 -1
  33. package/presets/opencode/agents/reviewer.md +31 -0
  34. package/presets/opencode/prompts/v0.3.0/architect.md +221 -0
  35. package/presets/opencode/prompts/v0.3.0/docs.md +189 -0
  36. package/presets/opencode/prompts/v0.3.0/implementer.md +162 -0
  37. package/presets/opencode/prompts/v0.3.0/orchestrator.md +360 -0
  38. package/presets/opencode/prompts/v0.3.0/repo-explorer.md +110 -0
  39. package/presets/opencode/prompts/v0.3.0/reviewer.md +225 -0
  40. package/presets/opencode/prompts/v0.3.0/task-coach.md +155 -0
  41. package/presets/opencode/prompts/v0.3.0/tester.md +251 -0
  42. package/presets/opencode/skills/android/SKILL.md +119 -0
  43. package/presets/opencode/skills/laravel-specialist/SKILL.md +264 -0
  44. package/presets/opencode/skills/laravel-specialist/references/eloquent.md +351 -0
  45. package/presets/opencode/skills/laravel-specialist/references/livewire.md +512 -0
  46. package/presets/opencode/skills/laravel-specialist/references/queues.md +423 -0
  47. package/presets/opencode/skills/laravel-specialist/references/routing.md +362 -0
  48. package/presets/opencode/skills/laravel-specialist/references/testing.md +522 -0
  49. package/presets/opencode/skills/php-pro/SKILL.md +208 -0
  50. package/presets/opencode/skills/php-pro/references/async-patterns.md +412 -0
  51. package/presets/opencode/skills/php-pro/references/laravel-patterns.md +377 -0
  52. package/presets/opencode/skills/php-pro/references/modern-php-features.md +323 -0
  53. package/presets/opencode/skills/php-pro/references/symfony-patterns.md +466 -0
  54. package/presets/opencode/skills/php-pro/references/testing-quality.md +466 -0
  55. package/src/presets/manifests/agy.yml +3 -2
  56. package/src/presets/manifests/claude.yml +3 -2
  57. package/src/presets/manifests/codex.yml +3 -2
  58. package/src/presets/manifests/cursor.yml +3 -2
  59. package/src/presets/manifests/gemini.yml +3 -2
  60. package/src/presets/manifests/opencode.yml +3 -2
  61. package/src/presets/models/opencode.yml +6 -6
@@ -0,0 +1,264 @@
1
+ ---
2
+ name: laravel-specialist
3
+ description: Build and configure Laravel 10+ applications, including creating Eloquent models and relationships, implementing Sanctum authentication, configuring Horizon queues, designing RESTful APIs with API resources, and building reactive interfaces with Livewire. Use when creating Laravel models, setting up queue workers, implementing Sanctum auth flows, building Livewire components, optimising Eloquent queries, or writing Pest/PHPUnit tests for Laravel features.
4
+ license: MIT
5
+ metadata:
6
+ author: https://github.com/Jeffallan
7
+ version: "1.1.0"
8
+ domain: backend
9
+ triggers: Laravel, Eloquent, PHP framework, Laravel API, Artisan, Blade templates, Laravel queues, Livewire, Laravel testing, Sanctum, Horizon
10
+ role: specialist
11
+ scope: implementation
12
+ output-format: code
13
+ related-skills: fullstack-guardian, test-master, devops-engineer, security-reviewer
14
+ ---
15
+
16
+ # Laravel Specialist
17
+
18
+ Senior Laravel specialist with deep expertise in Laravel 10+, Eloquent ORM, and modern PHP 8.2+ development.
19
+
20
+ ## Core Workflow
21
+
22
+ 1. **Analyse requirements** — Identify models, relationships, APIs, and queue needs
23
+ 2. **Design architecture** — Plan database schema, service layers, and job queues
24
+ 3. **Implement models** — Create Eloquent models with relationships, scopes, and casts; run `php artisan make:model` and verify with `php artisan migrate:status`
25
+ 4. **Build features** — Develop controllers, services, API resources, and jobs; run `php artisan route:list` to verify routing
26
+ 5. **Test thoroughly** — Write feature and unit tests; run `php artisan test` before considering any step complete (target >85% coverage)
27
+
28
+ ## Reference Guide
29
+
30
+ Load detailed guidance based on context:
31
+
32
+ | Topic | Reference | Load When |
33
+ |-------|-----------|-----------|
34
+ | Eloquent ORM | `references/eloquent.md` | Models, relationships, scopes, query optimization |
35
+ | Routing & APIs | `references/routing.md` | Routes, controllers, middleware, API resources |
36
+ | Queue System | `references/queues.md` | Jobs, workers, Horizon, failed jobs, batching |
37
+ | Livewire | `references/livewire.md` | Components, wire:model, actions, real-time |
38
+ | Testing | `references/testing.md` | Feature tests, factories, mocking, Pest PHP |
39
+
40
+ ## Constraints
41
+
42
+ ### MUST DO
43
+ - Use PHP 8.2+ features (readonly, enums, typed properties)
44
+ - Type hint all method parameters and return types
45
+ - Use Eloquent relationships properly (avoid N+1 with eager loading)
46
+ - Implement API resources for transforming data
47
+ - Queue long-running tasks
48
+ - Write comprehensive tests (>85% coverage)
49
+ - Use service containers and dependency injection
50
+ - Follow PSR-12 coding standards
51
+
52
+ ### MUST NOT DO
53
+ - Use raw queries without protection (SQL injection)
54
+ - Skip eager loading (causes N+1 problems)
55
+ - Store sensitive data unencrypted
56
+ - Mix business logic in controllers
57
+ - Hardcode configuration values
58
+ - Skip validation on user input
59
+ - Use deprecated Laravel features
60
+ - Ignore queue failures
61
+
62
+ ## Code Templates
63
+
64
+ Use these as starting points for every implementation.
65
+
66
+ ### Eloquent Model
67
+
68
+ ```php
69
+ <?php
70
+
71
+ declare(strict_types=1);
72
+
73
+ namespace App\Models;
74
+
75
+ use Illuminate\Database\Eloquent\Factories\HasFactory;
76
+ use Illuminate\Database\Eloquent\Model;
77
+ use Illuminate\Database\Eloquent\Relations\BelongsTo;
78
+ use Illuminate\Database\Eloquent\Relations\HasMany;
79
+ use Illuminate\Database\Eloquent\SoftDeletes;
80
+
81
+ final class Post extends Model
82
+ {
83
+ use HasFactory, SoftDeletes;
84
+
85
+ protected $fillable = ['title', 'body', 'status', 'user_id'];
86
+
87
+ protected $casts = [
88
+ 'status' => PostStatus::class, // backed enum
89
+ 'published_at' => 'immutable_datetime',
90
+ ];
91
+
92
+ // Relationships — always eager-load via ::with() at call site
93
+ public function author(): BelongsTo
94
+ {
95
+ return $this->belongsTo(User::class, 'user_id');
96
+ }
97
+
98
+ public function comments(): HasMany
99
+ {
100
+ return $this->hasMany(Comment::class);
101
+ }
102
+
103
+ // Local scope
104
+ public function scopePublished(Builder $query): Builder
105
+ {
106
+ return $query->where('status', PostStatus::Published);
107
+ }
108
+ }
109
+ ```
110
+
111
+ ### Migration
112
+
113
+ ```php
114
+ <?php
115
+
116
+ use Illuminate\Database\Migrations\Migration;
117
+ use Illuminate\Database\Schema\Blueprint;
118
+ use Illuminate\Support\Facades\Schema;
119
+
120
+ return new class extends Migration
121
+ {
122
+ public function up(): void
123
+ {
124
+ Schema::create('posts', function (Blueprint $table): void {
125
+ $table->id();
126
+ $table->foreignId('user_id')->constrained()->cascadeOnDelete();
127
+ $table->string('title');
128
+ $table->text('body');
129
+ $table->string('status')->default('draft');
130
+ $table->timestamp('published_at')->nullable();
131
+ $table->softDeletes();
132
+ $table->timestamps();
133
+ });
134
+ }
135
+
136
+ public function down(): void
137
+ {
138
+ Schema::dropIfExists('posts');
139
+ }
140
+ };
141
+ ```
142
+
143
+ ### API Resource
144
+
145
+ ```php
146
+ <?php
147
+
148
+ declare(strict_types=1);
149
+
150
+ namespace App\Http\Resources;
151
+
152
+ use Illuminate\Http\Request;
153
+ use Illuminate\Http\Resources\Json\JsonResource;
154
+
155
+ final class PostResource extends JsonResource
156
+ {
157
+ public function toArray(Request $request): array
158
+ {
159
+ return [
160
+ 'id' => $this->id,
161
+ 'title' => $this->title,
162
+ 'body' => $this->body,
163
+ 'status' => $this->status->value,
164
+ 'published_at' => $this->published_at?->toIso8601String(),
165
+ 'author' => new UserResource($this->whenLoaded('author')),
166
+ 'comments' => CommentResource::collection($this->whenLoaded('comments')),
167
+ ];
168
+ }
169
+ }
170
+ ```
171
+
172
+ ### Queued Job
173
+
174
+ ```php
175
+ <?php
176
+
177
+ declare(strict_types=1);
178
+
179
+ namespace App\Jobs;
180
+
181
+ use App\Models\Post;
182
+ use Illuminate\Bus\Queueable;
183
+ use Illuminate\Contracts\Queue\ShouldQueue;
184
+ use Illuminate\Foundation\Bus\Dispatchable;
185
+ use Illuminate\Queue\InteractsWithQueue;
186
+ use Illuminate\Queue\SerializesModels;
187
+
188
+ final class PublishPost implements ShouldQueue
189
+ {
190
+ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
191
+
192
+ public int $tries = 3;
193
+ public int $backoff = 60;
194
+
195
+ public function __construct(
196
+ private readonly Post $post,
197
+ ) {}
198
+
199
+ public function handle(): void
200
+ {
201
+ $this->post->update([
202
+ 'status' => PostStatus::Published,
203
+ 'published_at' => now(),
204
+ ]);
205
+ }
206
+
207
+ public function failed(\Throwable $e): void
208
+ {
209
+ // Log or notify — never silently swallow failures
210
+ logger()->error('PublishPost failed', ['post' => $this->post->id, 'error' => $e->getMessage()]);
211
+ }
212
+ }
213
+ ```
214
+
215
+ ### Feature Test (Pest)
216
+
217
+ ```php
218
+ <?php
219
+
220
+ use App\Models\Post;
221
+ use App\Models\User;
222
+
223
+ it('returns a published post for authenticated users', function (): void {
224
+ $user = User::factory()->create();
225
+ $post = Post::factory()->published()->for($user, 'author')->create();
226
+
227
+ $response = $this->actingAs($user)
228
+ ->getJson("/api/posts/{$post->id}");
229
+
230
+ $response->assertOk()
231
+ ->assertJsonPath('data.status', 'published')
232
+ ->assertJsonPath('data.author.id', $user->id);
233
+ });
234
+
235
+ it('queues a publish job when a draft is submitted', function (): void {
236
+ Queue::fake();
237
+ $user = User::factory()->create();
238
+ $post = Post::factory()->draft()->for($user, 'author')->create();
239
+
240
+ $this->actingAs($user)
241
+ ->postJson("/api/posts/{$post->id}/publish")
242
+ ->assertAccepted();
243
+
244
+ Queue::assertPushed(PublishPost::class, fn ($job) => $job->post->is($post));
245
+ });
246
+ ```
247
+
248
+ ## Validation Checkpoints
249
+
250
+ Run these at each workflow stage to confirm correctness before proceeding:
251
+
252
+ | Stage | Command | Expected Result |
253
+ |-------|---------|-----------------|
254
+ | After migration | `php artisan migrate:status` | All migrations show `Ran` |
255
+ | After routing | `php artisan route:list --path=api` | New routes appear with correct verbs |
256
+ | After job dispatch | `php artisan queue:work --once` | Job processes without exception |
257
+ | After implementation | `php artisan test --coverage` | >85% coverage, 0 failures |
258
+ | Before PR | `./vendor/bin/pint --test` | PSR-12 linting passes |
259
+
260
+ ## Knowledge Reference
261
+
262
+ Laravel 10+, Eloquent ORM, PHP 8.2+, API resources, Sanctum/Passport, queues, Horizon, Livewire, Inertia, Octane, Pest/PHPUnit, Redis, broadcasting, events/listeners, notifications, task scheduling
263
+
264
+ [Documentation](https://jeffallan.github.io/claude-skills/skills/backend/laravel-specialist/)
@@ -0,0 +1,351 @@
1
+ # Eloquent ORM
2
+
3
+ ## Model Patterns
4
+
5
+ ```php
6
+ <?php
7
+
8
+ namespace App\Models;
9
+
10
+ use Illuminate\Database\Eloquent\Model;
11
+ use Illuminate\Database\Eloquent\Factories\HasFactory;
12
+ use Illuminate\Database\Eloquent\SoftDeletes;
13
+ use Illuminate\Database\Eloquent\Casts\Attribute;
14
+
15
+ class Post extends Model
16
+ {
17
+ use HasFactory, SoftDeletes;
18
+
19
+ protected $fillable = [
20
+ 'title',
21
+ 'slug',
22
+ 'content',
23
+ 'published_at',
24
+ 'user_id',
25
+ ];
26
+
27
+ protected $casts = [
28
+ 'published_at' => 'datetime',
29
+ 'metadata' => 'array',
30
+ 'is_featured' => 'boolean',
31
+ ];
32
+
33
+ // Accessor using new Attribute syntax (Laravel 9+)
34
+ protected function title(): Attribute
35
+ {
36
+ return Attribute::make(
37
+ get: fn (string $value) => ucfirst($value),
38
+ set: fn (string $value) => strtolower($value),
39
+ );
40
+ }
41
+
42
+ // Mutator for computed property
43
+ protected function excerpt(): Attribute
44
+ {
45
+ return Attribute::make(
46
+ get: fn () => str($this->content)->limit(100),
47
+ );
48
+ }
49
+ }
50
+ ```
51
+
52
+ ## Relationships
53
+
54
+ ```php
55
+ // One-to-Many
56
+ class User extends Model
57
+ {
58
+ public function posts(): HasMany
59
+ {
60
+ return $this->hasMany(Post::class);
61
+ }
62
+
63
+ public function latestPost(): HasOne
64
+ {
65
+ return $this->hasOne(Post::class)->latestOfMany();
66
+ }
67
+
68
+ public function oldestPost(): HasOne
69
+ {
70
+ return $this->hasOne(Post::class)->oldestOfMany();
71
+ }
72
+ }
73
+
74
+ class Post extends Model
75
+ {
76
+ public function user(): BelongsTo
77
+ {
78
+ return $this->belongsTo(User::class);
79
+ }
80
+
81
+ // Inverse relationship
82
+ public function comments(): HasMany
83
+ {
84
+ return $this->hasMany(Comment::class);
85
+ }
86
+ }
87
+
88
+ // Many-to-Many with Pivot
89
+ class User extends Model
90
+ {
91
+ public function roles(): BelongsToMany
92
+ {
93
+ return $this->belongsToMany(Role::class)
94
+ ->withPivot('expires_at', 'assigned_by')
95
+ ->withTimestamps()
96
+ ->using(RoleUser::class); // Custom pivot model
97
+ }
98
+ }
99
+
100
+ // Has Many Through
101
+ class Country extends Model
102
+ {
103
+ public function posts(): HasManyThrough
104
+ {
105
+ return $this->hasManyThrough(Post::class, User::class);
106
+ }
107
+ }
108
+
109
+ // Polymorphic Relations
110
+ class Image extends Model
111
+ {
112
+ public function imageable(): MorphTo
113
+ {
114
+ return $this->morphTo();
115
+ }
116
+ }
117
+
118
+ class Post extends Model
119
+ {
120
+ public function images(): MorphMany
121
+ {
122
+ return $this->morphMany(Image::class, 'imageable');
123
+ }
124
+ }
125
+
126
+ // Many-to-Many Polymorphic
127
+ class Tag extends Model
128
+ {
129
+ public function posts(): MorphToMany
130
+ {
131
+ return $this->morphedByMany(Post::class, 'taggable');
132
+ }
133
+
134
+ public function videos(): MorphToMany
135
+ {
136
+ return $this->morphedByMany(Video::class, 'taggable');
137
+ }
138
+ }
139
+ ```
140
+
141
+ ## Query Scopes
142
+
143
+ ```php
144
+ class Post extends Model
145
+ {
146
+ // Local scope
147
+ public function scopePublished($query): void
148
+ {
149
+ $query->whereNotNull('published_at')
150
+ ->where('published_at', '<=', now());
151
+ }
152
+
153
+ public function scopePopular($query, int $threshold = 100): void
154
+ {
155
+ $query->where('views', '>=', $threshold);
156
+ }
157
+
158
+ // Global scope
159
+ protected static function booted(): void
160
+ {
161
+ static::addGlobalScope('active', function ($query) {
162
+ $query->where('status', 'active');
163
+ });
164
+ }
165
+ }
166
+
167
+ // Usage
168
+ $posts = Post::published()->popular(500)->get();
169
+
170
+ // Custom Scope Class
171
+ namespace App\Models\Scopes;
172
+
173
+ use Illuminate\Database\Eloquent\Builder;
174
+ use Illuminate\Database\Eloquent\Model;
175
+ use Illuminate\Database\Eloquent\Scope;
176
+
177
+ class AncientScope implements Scope
178
+ {
179
+ public function apply(Builder $builder, Model $model): void
180
+ {
181
+ $builder->where('created_at', '<', now()->subYears(10));
182
+ }
183
+ }
184
+
185
+ // Apply in model
186
+ protected static function booted(): void
187
+ {
188
+ static::addGlobalScope(new AncientScope);
189
+ }
190
+ ```
191
+
192
+ ## Custom Casts
193
+
194
+ ```php
195
+ namespace App\Casts;
196
+
197
+ use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
198
+
199
+ class Money implements CastsAttributes
200
+ {
201
+ public function get($model, string $key, $value, array $attributes): float
202
+ {
203
+ return $value / 100; // Store cents, return dollars
204
+ }
205
+
206
+ public function set($model, string $key, $value, array $attributes): int
207
+ {
208
+ return (int) ($value * 100);
209
+ }
210
+ }
211
+
212
+ // In model
213
+ protected $casts = [
214
+ 'price' => Money::class,
215
+ ];
216
+ ```
217
+
218
+ ## Query Optimization
219
+
220
+ ```php
221
+ // Eager Loading (prevent N+1)
222
+ $posts = Post::with(['user', 'comments.user'])->get();
223
+
224
+ // Lazy Eager Loading
225
+ $posts = Post::all();
226
+ $posts->load('user');
227
+
228
+ // Eager Load with Constraints
229
+ $users = User::with(['posts' => function ($query) {
230
+ $query->where('published', true)->orderBy('created_at', 'desc');
231
+ }])->get();
232
+
233
+ // Count relationships efficiently
234
+ $posts = Post::withCount('comments')->get();
235
+ foreach ($posts as $post) {
236
+ echo $post->comments_count;
237
+ }
238
+
239
+ // Exists checks
240
+ $users = User::withExists('posts')->get();
241
+
242
+ // Chunk for large datasets
243
+ Post::chunk(100, function ($posts) {
244
+ foreach ($posts as $post) {
245
+ // Process post
246
+ }
247
+ });
248
+
249
+ // Lazy collection for memory efficiency
250
+ Post::lazy()->each(function ($post) {
251
+ // Process one at a time
252
+ });
253
+ ```
254
+
255
+ ## Model Events
256
+
257
+ ```php
258
+ class Post extends Model
259
+ {
260
+ protected static function booted(): void
261
+ {
262
+ static::creating(function ($post) {
263
+ $post->slug = str($post->title)->slug();
264
+ });
265
+
266
+ static::updating(function ($post) {
267
+ if ($post->isDirty('title')) {
268
+ $post->slug = str($post->title)->slug();
269
+ }
270
+ });
271
+
272
+ static::deleted(function ($post) {
273
+ $post->images()->delete();
274
+ });
275
+ }
276
+ }
277
+
278
+ // Using Observers
279
+ namespace App\Observers;
280
+
281
+ class PostObserver
282
+ {
283
+ public function creating(Post $post): void
284
+ {
285
+ $post->user_id = auth()->id();
286
+ }
287
+
288
+ public function updated(Post $post): void
289
+ {
290
+ cache()->forget("post.{$post->id}");
291
+ }
292
+ }
293
+
294
+ // Register in AppServiceProvider
295
+ use App\Models\Post;
296
+ use App\Observers\PostObserver;
297
+
298
+ public function boot(): void
299
+ {
300
+ Post::observe(PostObserver::class);
301
+ }
302
+ ```
303
+
304
+ ## Advanced Queries
305
+
306
+ ```php
307
+ // Subqueries
308
+ $users = User::select(['id', 'name'])
309
+ ->addSelect(['latest_post_title' => Post::select('title')
310
+ ->whereColumn('user_id', 'users.id')
311
+ ->latest()
312
+ ->limit(1)
313
+ ])->get();
314
+
315
+ // When conditional queries
316
+ $posts = Post::query()
317
+ ->when($search, fn ($query) => $query->where('title', 'like', "%{$search}%"))
318
+ ->when($category, fn ($query) => $query->where('category_id', $category))
319
+ ->get();
320
+
321
+ // Database transactions
322
+ DB::transaction(function () {
323
+ $user = User::create([...]);
324
+ $user->profile()->create([...]);
325
+ $user->assignRole('member');
326
+ });
327
+
328
+ // Pessimistic locking
329
+ $user = User::where('id', 1)->lockForUpdate()->first();
330
+
331
+ // Upserts
332
+ User::upsert(
333
+ [
334
+ ['email' => 'john@example.com', 'name' => 'John'],
335
+ ['email' => 'jane@example.com', 'name' => 'Jane'],
336
+ ],
337
+ ['email'], // Unique columns
338
+ ['name'] // Columns to update
339
+ );
340
+ ```
341
+
342
+ ## Performance Tips
343
+
344
+ 1. **Always eager load relationships** - Avoid N+1 queries
345
+ 2. **Use chunking for large datasets** - Prevent memory exhaustion
346
+ 3. **Index foreign keys** - Speed up joins
347
+ 4. **Use select() to limit columns** - Reduce data transfer
348
+ 5. **Cache expensive queries** - Use Redis/Memcached
349
+ 6. **Use database indexing** - Add indexes in migrations
350
+ 7. **Avoid using model events for heavy operations** - Use queues instead
351
+ 8. **Use lazy collections** - For processing large datasets