Skip to content

HasTablePrefix Trait ​

The HasTablePrefix trait automatically prefixes database table names based on the module name, providing better organization and preventing table name collisions between modules.

Features ​

This trait offers:

  • Automatic detection of the module name from the class namespace
  • Dynamic generation of prefixed table names
  • Static access to table names for use in migrations
  • Standardized naming convention for module tables

Methods ​

getTable(): string ​

Generates the table name with the appropriate prefix.

  • Returns:
    • The prefixed table name
  • Behavior:
    • Extracts the module name from the class namespace
    • Converts the class name to snake_case and pluralizes it
    • Looks up the table prefix from the module's configuration
    • Prepends the prefix to the table name

getTableName(): string ​

Static method for accessing the table name from anywhere.

  • Returns:
    • The prefixed table name
  • Behavior:
    • Creates a new instance of the class and calls getTable()
    • Useful in migrations and other static contexts

Configuration ​

To use this trait, add a table_prefix key to your module's configuration:

php
// config/blog.php
return [
    'table_prefix' => 'blog_',
    // Other configuration...
];

If no prefix is configured, the trait will use an empty prefix.

Usage Example ​

Model Definition ​

php
<?php

namespace Modules\Blog\Models;

use Illuminate\Database\Eloquent\Model;
use ModuleManager\ModuleManager\Concerns\HasTablePrefix;

class Post extends Model
{
    use HasTablePrefix;

    // No need to specify $table property

    protected $fillable = [
        'title',
        'content',
        'author_id',
    ];
}

Migration Usage ​

php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Modules\Blog\Models\Post;

class CreatePostsTable extends Migration
{
    public function up(): void
    {
        // Will create "blog_posts" table
        Schema::create(Post::getTableName(), function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->foreignId('author_id');
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists(Post::getTableName());
    }
}

Notes ​

  • Using this trait eliminates the need to manually define the $table property in models
  • Table names are standardized across your module, reducing naming inconsistencies
  • The trait works well in multi-module applications to prevent table name conflicts
  • It's recommended to use the static getTableName() method in migrations for consistency