trappistes/laravel-custom-fields
Flexible EAV custom fields for Laravel Eloquent: add dynamic attributes without schema changes. Supports strong types (int, bool, json, date, ranges), polymorphic relations for any model, eager loading to avoid N+1, auto casting, batch upsert, validation, and soft deletes.
model_type/model_id, reducing schema bloat. However, this may complicate queries involving joins or aggregations.json, datetime) and validation mitigate runtime errors but require careful handling of edge cases (e.g., malformed JSON or invalid dates).text/varchar fields and basic indexing. UUID/ULID support is optional but adds flexibility for distributed systems.with('customFields')), dynamic field access triggers additional queries. Mitigated by the package’s preloading support but requires discipline in query construction.upsert helps but may still stress the database)?HasCustomFields), requiring minimal boilerplate.// Cache custom fields for 5 minutes
$cachedFields = Cache::remember("user:{$user->id}:custom_fields", 300, function() use ($user) {
return $user->getAllCustomFields();
});
composer require trappistes/laravel-custom-fields.php artisan vendor:publish --provider="Trappistes\CustomFields\Providers\CustomFieldsServiceProvider".php artisan migrate (creates custom_fields table).use Trappistes\CustomFields\Traits\HasCustomFields; to target models.class User extends Model
{
use HasCustomFields;
}
CustomField model (as documented).CustomField model to add business logic (e.g., field name whitelisting).with('customFields') to avoid N+1:
$users = User::with('customFields')->get();
setCustomFields() in a data seed or migration:
User::find(1)->setCustomFields(['nickname' => 'John']);
json and pdo extensions (standard in Laravel).Illuminate\Database\Eloquent\SoftDeletes.App\Http\Resources\UserResource:
public function toArray($request)
{
return [
'name' => $this->name,
'custom' => $this->getAllCustomFields(),
];
}
HasCustomFields into 1–2 pilot models (e.g., User, Product).upsert for write-heavy workloads.CustomField model for validation or UUID support.custom_fields table.setCustomField('new_field', ...)).// Custom validation rule
use Trappistes\CustomFields\Rules\ValidCustomFieldKey;
$request->validate([
'custom_field' => ['required', new ValidCustomFieldKey],
]);
hasCustomField() to check existence before access:
if ($user->hasCustomField('age')) {
$age = $user->getCustomField('age');
}
field_type in the custom_fields table.How can I help you explore Laravel packages today?