Skip to content

WatheqAlshowaiter/model-required-fields

Repository files navigation

Package cover

Model Required Fields

Latest Version on Packagist Total Downloads GitHub Code Style Action Status GitHub Tests For Laravel Versions Action Status GitHub Tests For Databases Action Status

Get the required model fields, excluding primary keys, nullable fields, and fields with defaults.

Installation

You can install the package via Composer:

composer require watheqalshowaiter/model-required-fields --dev

We prefer --dev because usually you will use it in development, not in production.

Usage

We Assume that the User model has this schema as the defaults

Schema::create('users', function (Blueprint $table) {
    $table->id(); // primary key
    $table->string('name'); // required
    $table->string('email')->unique(); // required
    $table->timestamp('email_verified_at')->nullable(); // nullable
    $table->string('password'); // required
    $table->rememberToken(); // nullable
    $table->timestamps(); // nullable
});
  • Add the RequiredFields trait to your model
use WatheqAlshowaiter\ModelRequiredFields\RequiredFields;

class User extends Model
{
   use RequiredFields;
}
  • Now use the trait as follows
User::getRequiredFields(); // returns ['name', 'email', 'password']

That's it!

Another Complex Table

let's say the Post model has these fields

Schema::create('posts', function (Blueprint $table) {
    $table->uuid('id')->primary(); // primary key
    $table->foreignId('user_id')->constrained(); // required
    $table->foreignId('category_id')->nullable(); // nullable
    $table->uuid(); // required (but will be changed later) πŸ‘‡
    $table->ulid('ulid')->nullable(); // nullable (but will be changed later) πŸ‘‡
    $table->boolean('active')->default(false); // default
    $table->string('title'); // required
    $table->json('description')->nullable(); // nullable (but will be changed later) πŸ‘‡
    $table->string('slug')->nullable()->unique(); // nullable
    $table->timestamps(); // nullable
    $table->softDeletes(); // nullable
});

// later migration..
Schema::table('posts', function(Blueprint $table){
    $table->json('description')->nullable(false)->change(); // required
    $table->ulid('ulid')->nullable(false)->change(); // required
    $table->uuid()->nullable()->change(); // nullable
});
  • We can add the RequiredFields trait to the Post Model
use WatheqAlshowaiter\ModelRequiredFields\RequiredFields;

class Post extends Model
{
   use RequiredFields;
}
  • Now use the trait as follows
Post::getRequiredFields(); // returns ['user_id', 'ulid', 'title', 'description']

And more

We have the flexibility to get required fields with nullables, defaults, primary keys, and a mix of them or return all fields. You can use these methods with these results:

// The default parameters, only required fields
Post::getRequiredFields(
    $withNullables = false,
    $withDefaults = false,
    $withPrimaryKey = false
);
// or
Post::getRequiredFields();
// returns ['user_id', 'ulid', 'title', 'description']
// get required fields with nullables
Post::getRequiredFields(
    $withNullables = true,
    $withDefaults = false,
    $withPrimaryKey = false
);
// or
Post::getRequiredFields(
    $withNullables = true,
);
// or
Post::getRequiredFields(true);
// or
Post::getRequiredFieldsWithNullables();
// returns ['user_id', 'category_id', 'uuid', 'ulid', 'title', 'description', 'slug', 'created_at', 'updated_at', 'deleted_at']
// get required fields with defaults
Post::getRequiredFields(
    $withNullables = false,
    $withDefaults = true,
    $withPrimaryKey = false
);
// or
Post::getRequiredFieldsWithDefaults();
// returns ['user_id', 'ulid', 'active', 'title', 'description']
// get required fields with primary key
Post::getRequiredFields(
    $withNullables = false,
    $withDefaults = false,
    $withPrimaryKey = true
);
// or
Post::getRequiredFieldsWithPrimaryKey();
// returns ['id', 'user_id', 'ulid', 'title', 'description']
// get required fields with nullables and defaults
Post::getRequiredFields(
    $withNullables = true,
    $withDefaults = true,
    $withPrimaryKey = false
);
// or
Post::getRequiredFieldsWithNullablesAndDefaults();
// returns ['user_id', 'category_id', 'uuid', 'ulid', 'active', 'title', 'description', 'slug', 'created_at', 'updated_at', 'deleted_at']
// get required fields with nullables and primary key
Post::getRequiredFields(
    $withNullables = true,
    $withDefaults = false,
    $withPrimaryKey = true
);
// or
Post::getRequiredFieldsWithNullablesAndPrimaryKey();
// returns ['id', 'user_id', 'category_id', 'uuid', 'ulid', 'title', 'description', 'slug', 'created_at', 'updated_at', 'deleted_at']
// get required fields with defaults and primary key
Post::getRequiredFields(
    $withNullables = false,
    $withDefaults = true,
    $withPrimaryKey = true
);
// or
Post::getRequiredFieldsWithDefaultsAndPrimaryKey();
// returns ['id', 'user_id', 'ulid', 'active', 'title', 'description']
// get required fields with defaults and primary key
Post::getRequiredFields(
    $withNullables = true,
    $withDefaults = true,
    $withPrimaryKey = true
);
// or
Post::getAllFields();
// returns ['id', 'user_id', 'category_id', 'uuid', 'ulid', 'active', 'title', 'description', 'slug', 'created_at', 'updated_at', 'deleted_at']

Why?

The problem

I wanted to add tests to a legacy project that didn't have any. I wanted to add tests but couldn't find a factory, so I tried building them. However, it was hard to figure out the required fields for testing the basic functionality since some tables have too many fields.

The Solution

To solve this, I created a simple trait that retrieves the required fields easily. Later, I added support for older Laravel versions, as that was where most of the use cases occurred. Eventually, I extracted it into this package.

So Briefly, This package is useful if:

  • you want to build factories or tests for projects you didn't start from scratch.
  • you are working with a legacy project and don't want to be faced with SQL errors when creating tables.
  • you have so many fields in your table and want to get the required fields fast.
  • or any use case you find it useful.

Features

βœ… Supports Laravel versions: 11, 10, 9, 8, 7, and 6.

βœ… Supports PHP versions: 8.2, 8.1, 8.0, and 7.4.

βœ… Supports SQL databases: SQLite, MySQL/MariaDB, PostgreSQL, and SQL Server.

βœ… Fully automated tested with PHPUnit.

βœ… Full GitHub Action CI pipeline to format code and test against all Laravel and PHP versions.

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

If you have any ideas or suggestions to improve it or fix bugs, your contribution is welcome. I encourage you to look at todos which are the most important features need to be added. If you have something different, submit an issue first to discus or report a bug, then do a pull request.

Security Vulnerabilities

If you find any security vulnerabilities don't hesitate to contact me at watheqalshowaiter[at]gmail[dot]com to fix them.

Credits

License

The MIT License (MIT). Please see License File for more information.