Laravel migration that creates the user_filter_presets table. Includes a foreign key to users.user_id with cascade delete, and a composite index on (user_id, page) for fast per-user, per-page queries.
Schema::create('user_filter_presets', function (Blueprint $table) { $table->id(); $table->unsignedInteger('user_id'); $table->string('page', 50); // e.g. 'monitoring' $table->string('name', 100); // user-given preset name $table->json('filters'); // saved filter state $table->tinyInteger('is_default')->default(0); $table->timestamps(); $table->index(['user_id', 'page']); $table->foreign('user_id')->references('user_id')->on('users')->onDelete('cascade'); });
Eloquent model for the user_filter_presets table. The filters field auto-casts to/from PHP array. The is_default field auto-casts to boolean. Includes two query scopes for clean filtering in controllers.
class UserFilterPreset extends Model { protected $fillable = ['user_id', 'page', 'name', 'filters', 'is_default']; protected $casts = [ 'filters' => 'array', 'is_default' => 'boolean', ]; // Relationship public function user(): BelongsTo => $this->belongsTo(User::class, 'user_id', 'user_id'); // Scopes public function scopeForPage($query, string $page) => $query->where('page', $page); public function scopeForUser($query, int $userId) => $query->where('user_id', $userId); }
| Column | Type | Nullable | Default | Notes |
|---|---|---|---|---|
| id | bigint unsigned | NO | — | Primary key, auto-increment |
| user_id | int unsigned | NO | — | FK → users.user_id (cascade delete) |
| page | varchar(50) | NO | — | e.g. 'monitoring' |
| name | varchar(100) | NO | — | User-given preset name |
| filters | json | NO | — | Saved filter state as JSON object |
| is_default | tinyint | NO | 0 | 1 = auto-load on page open |
| created_at | timestamp | YES | NULL | Laravel timestamp |
| updated_at | timestamp | YES | NULL | Laravel timestamp |
Index: Composite index on (user_id, page) for fast per-user, per-page lookups.
Foreign Key: user_id → users.user_id ON DELETE CASCADE — presets are automatically deleted when a user is removed.
| Criterion | Result | Verified By |
|---|---|---|
| Migration runs without error | ✓ PASS | Table confirmed present via DESCRIBE user_filter_presets |
| Model can be instantiated and saved | ✓ PASS | UserFilterPreset::save() executed, id=1 returned |
| filters field casts to/from array | ✓ PASS | Saved as JSON, retrieved as PHP array |
| is_default casts to boolean | ✓ PASS | Retrieved value confirmed as false (bool) |
| scopeForPage() filters correctly | ✓ PASS | Query returned correct record |
| scopeForUser() filters correctly | ✓ PASS | Query returned correct record |
| No other files modified | ✓ PASS | Only 2 new files created |