PHPackages                             khairy/migration-model-sync - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. khairy/migration-model-sync

ActiveLibrary[Database &amp; ORM](/categories/database)

khairy/migration-model-sync
===========================

Automatically sync Laravel models from migration files, including fillable, casts, and relationships.

v1.0.0(9mo ago)234MITPHPPHP &gt;=8.0

Since Aug 15Pushed 9mo agoCompare

[ Source](https://github.com/mohamd-khairy/migration-model-sync)[ Packagist](https://packagist.org/packages/khairy/migration-model-sync)[ Docs](https://github.com/mohamd-khairy/migration-model-sync)[ RSS](/packages/khairy-migration-model-sync/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (2)Versions (2)Used By (0)

🧬 Laravel Migration Model Sync
==============================

[](#-laravel-migration-model-sync)

**Laravel Migration Model Sync** is a development tool that automatically generates or synchronizes Eloquent model files based on your migration files. It extracts columns, data types, and foreign key relationships and applies them directly to your model"s `$fillable`, `$casts`, and relationship methods.

---

🚀 Features
----------

[](#-features)

- 🔄 **Sync existing models**: Adds missing `$fillable`, `$casts`, and relationships
- 🧱 **Generate new models**: Creates clean models directly from migrations
- 🧠 **Smart relationship inference**:
    - `belongsTo` from foreign keys
    - `hasMany`, `hasOne`, and `belongsToMany`
- 🗃 Supports both Laravel default and custom migration styles
- 📁 Easily configurable via `config/modelsync.php`
- ✨ **Sync all models**: A new `model:sync-all` command to synchronize all models from available migration files.
- 🛠 **Generate migrations from models**: `model:generate-migration User` — creates a migration file for a specific model
- 🛠 **Generate migrations from models**: `model:generate-migrations` — auto-generates all migration files from models (with dependency-aware sorting)

---

📦 Installation
--------------

[](#-installation)

> Laravel versions supported: **8.x – 12.x**

### 1. If using from Packagist:

[](#1-if-using-from-packagist)

```
composer require khairy/migration-model-sync
```

### 2. Publish the Configuration

[](#2-publish-the-configuration)

```
php artisan vendor:publish --tag=modelsync-config
```

This creates the config file: `config/modelsync.php`

---

⚙️ Configuration
----------------

[](#️-configuration)

Edit `config/modelsync.php` to customize behavior:

```
return [
    \"model_path\" => app_path(\"Models\"),

    \"ignore_columns\" => [
        \"created_at\",
        \"updated_at\",
    ],

    \"relationship_overrides\" => [
        // \"created_by\" => \"belongsTo:App\\Models\\User\"
    ],
];
```

- **model\_path**: Specifies the directory where generated models will be stored. By default, this is `app/Models`.
- **ignore\_columns**: An array of column names that should be excluded from the `$fillable` and `$casts` properties of the generated models. Common examples include `created_at` and `updated_at`.
- **relationship\_overrides**: Allows you to manually define or override specific relationship definitions for models. This is useful for complex or non-standard relationships that cannot be automatically inferred.

---

🧪 Usage
-------

[](#-usage)

### Sync a single model

[](#sync-a-single-model)

```
php artisan model:sync User
```

This command will:

- Parse the migration that created `users` table
- Add `$fillable`, `$casts`, and any `belongsTo` relationships to `app/Models/User.php`

### Sync all models

[](#sync-all-models)

```
php artisan model:sync-all
```

This command will:

- Iterate through all migration files that create tables
- Parse each migration to extract schema information
- Generate or update the corresponding Eloquent model with `$fillable`, `$casts`, and inferred `belongsTo` relationships.

### Generate migration file from model class

[](#generate-migration-file-from-model-class)

```
php artisan model:generate-migration User
```

This command will:

- Read `app/Models/User.php`
- Extract `$fillable`, `$casts`, and any `belongsTo()` relationships
- Infer column types `(string, timestamp, json, etc.)`
- Generate a `create_users_table.php` migration in `database/migrations`
- Include `foreignId()->constrained()->on(...)` if `belongsTo()` is present
- Automatically add `timestamps` and `soft deletes` if applicable

### Generate migration files from model classs

[](#generate-migration-files-from-model-classs)

```
php artisan model:generate-migrations
```

This command will:

- Loop through all model classes in app/Models/
- Read their `$fillable`, `$casts`, and `belongsTo()` methods
- Generate new `create_*_table.php` migration files
- Sort migrations by relationship dependency (by default)
- Automatically set timestamps to maintain migration order
- Use options like `--only=User,Post` , `--except=Log` , `--sort=none` , and `--force` for advanced control.

### Example Migration

[](#example-migration)

```
Schema::create(\"profiles\", function (Blueprint $table) {
    $table->id();
    $table->string(\"name\");
    $table->string(\"email\");
    $table->timestamp(\"email_verified_at\")->nullable();
    $table->string(\"password\");
    $table->foreignId(\"user_id\")->constrained();
    $table->timestamps();
});
```

### Resulting Model

[](#resulting-model)

```
namespace App\\Models;

use Illuminate\\Database\\Eloquent\\Model;

class Profile extends Model
{
    protected $fillable = [\"name\", \"email\", \"email_verified_at\", \"password\", \"user_id\"];

    protected $casts = [
        \"email_verified_at\" => \"datetime\",
        \"created_at\" => \"datetime\",
        \"updated_at\" => \"datetime\",
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
```

---

💡 How Relationships Are Inferred
--------------------------------

[](#-how-relationships-are-inferred)

Relation TypeDetection LogicbelongsTo`foreignId(\"user_id\")->constrained()` or foreign key chainshasManyInferred from other tables containing a foreign key to this model *(todo)*hasOneInferred from `profiles`, `settings`, etc. *(todo)*belongsToManyDetected from pivot tables like `role_user` *(todo)*---

🧩 Extending the Package
-----------------------

[](#-extending-the-package)

You can override default behavior:

- Use `relationship_overrides` in config to manually define model relations
- You can also stub and customize the model template (coming soon)

---

🤝 Contributing
--------------

[](#-contributing)

Pull requests are welcome! Please fork the repo, improve, and submit a PR. For major changes, open an issue first.

---

📄 License
---------

[](#-license)

MIT License © [Khairy](https://github.com/mohamd-khairy)

---

🌐 Links
-------

[](#-links)

- GitHub: [github.com/mohamd-khairy/migration-model-sync](https://github.com/mohamd-khairy/migration-model-sync)
- Packagist: [packagist.org/packages/khairy/migration-model-sync](https://packagist.org/packages/khairy/migration-model-sync)

###  Health Score

30

—

LowBetter than 64% of packages

Maintenance58

Moderate activity, may be stable

Popularity10

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity40

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

276d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/089da85f93de6cbdb1acedb6e8fea4f26706c4127ec609a4a392bb0e0f8c9adc?d=identicon)[mohamd-khairy](/maintainers/mohamd-khairy)

---

Top Contributors

[![mohamd-khairy](https://avatars.githubusercontent.com/u/22400438?v=4)](https://github.com/mohamd-khairy "mohamd-khairy (8 commits)")

---

Tags

laravel

### Embed Badge

![Health badge](/badges/khairy-migration-model-sync/health.svg)

```
[![Health](https://phpackages.com/badges/khairy-migration-model-sync/health.svg)](https://phpackages.com/packages/khairy-migration-model-sync)
```

###  Alternatives

[illuminate/database

The Illuminate Database package.

2.8k52.4M9.4k](/packages/illuminate-database)[cybercog/laravel-love

Make Laravel Eloquent models reactable with any type of emotions in a minutes!

1.2k302.7k1](/packages/cybercog-laravel-love)[cviebrock/eloquent-taggable

Easy ability to tag your Eloquent models in Laravel.

567694.8k3](/packages/cviebrock-eloquent-taggable)[clickbar/laravel-magellan

This package provides functionality for working with the postgis extension in Laravel.

423715.4k1](/packages/clickbar-laravel-magellan)[reedware/laravel-relation-joins

Adds the ability to join on a relationship by name.

2121.2M13](/packages/reedware-laravel-relation-joins)[cybercog/laravel-clickhouse

ClickHouse migrations for Laravel

163166.8k](/packages/cybercog-laravel-clickhouse)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
