PHPackages                             devlin/laravel-model-analyzer - 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. devlin/laravel-model-analyzer

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

devlin/laravel-model-analyzer
=============================

Analyze and validate Eloquent relationships against database schema

v2.2.1(2mo ago)116MITPHPPHP ^8.1

Since Feb 20Pushed 2mo agoCompare

[ Source](https://github.com/dev-lin2/laravel-model-optimizer)[ Packagist](https://packagist.org/packages/devlin/laravel-model-analyzer)[ RSS](/packages/devlin-laravel-model-analyzer/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (14)Versions (15)Used By (0)

Laravel Model Analyzer
======================

[](#laravel-model-analyzer)

A Laravel package that scans your Eloquent models and validates their relationships against your actual database schema. It detects missing inverse relationships, circular dependencies, missing foreign key columns, missing indexes, and more — then reports a health score for your model layer.

Demo
====

[](#demo)

You can check a quick demo [here](http://optimizer.linaung.dev/)

Requirements
------------

[](#requirements)

DependencyVersionPHP`^7.4` or `^8.0`Laravel / Illuminate`^8.0`Symfony Finder`^5.0`Installation
------------

[](#installation)

Install via Composer:

```
composer require devlin/laravel-model-analyzer
```

Laravel's package auto-discovery registers the service provider automatically. If you have auto-discovery disabled, add the provider manually in `config/app.php`:

```
'providers' => [
    Devlin\ModelAnalyzer\ModelAnalyzerServiceProvider::class,
],
```

### Publish the config file

[](#publish-the-config-file)

```
php artisan vendor:publish --provider="Devlin\ModelAnalyzer\ModelAnalyzerServiceProvider"
```

This creates `config/model-analyzer.php`.

Configuration
-------------

[](#configuration)

```
// config/model-analyzer.php

return [
    // Directories where your Eloquent models live
    'model_paths' => [
        app_path('Models'),
        app_path(), // Laravel < 8
    ],

    // Fully-qualified class names to skip
    'excluded_models' => [
        'Illuminate\Notifications\DatabaseNotification',
    ],

    // Database tables to skip
    'excluded_tables' => [
        'migrations',
        'failed_jobs',
        'password_resets',
        'personal_access_tokens',
    ],

    // Database connection to use (null = default connection)
    'database_connection' => null,

    // When true, warnings are treated as errors (non-zero exit code)
    'strict_mode' => env('MODEL_ANALYZER_STRICT', false),

    // Point weights used to calculate the 0–100 health score
    'health_weights' => [
        'has_inverse'     => 30,
        'no_circular'     => 30,
        'column_exists'   => 20,
        'has_index'       => 10,
        'has_foreign_key' => 10,
    ],
];
```

Commands
--------

[](#commands)

### `model-analyzer:analyze`

[](#model-analyzeranalyze)

Runs a full analysis of all discovered models and prints a report.

```
php artisan model-analyzer:analyze
```

**Options:**

OptionDescription`--format=cli`Output format: `cli` (default) or `json``--strict`Exit with code `1` if any warnings are found`--models=User,Post`Analyze only the specified models (comma-separated)**Examples:**

```
# Default CLI report
php artisan model-analyzer:analyze

# JSON output (pipe-friendly, useful in CI)
php artisan model-analyzer:analyze --format=json

# Fail CI if any warnings exist
php artisan model-analyzer:analyze --strict

# Analyze a single model
php artisan model-analyzer:analyze --models=User
```

**Exit codes:**

- `0` — no errors (warnings are allowed unless `--strict` is used)
- `1` — errors found, or warnings found with `--strict`

---

### `model-analyzer:health`

[](#model-analyzerhealth)

Displays a summary health score and grouped recommendation report.

```
php artisan model-analyzer:health
```

**Exit codes:**

- `0` — no errors
- `1` — one or more errors detected

---

### `model-analyzer:list-models`

[](#model-analyzerlist-models)

Lists all Eloquent models discovered in the configured paths.

```
php artisan model-analyzer:list-models
```

**Options:**

OptionDescription`--with-relationships`Show relationship count per model`--json`Output as a JSON array of fully-qualified class names**Examples:**

```
php artisan model-analyzer:list-models
php artisan model-analyzer:list-models --with-relationships
php artisan model-analyzer:list-models --json
```

### `model-analyzer:visualize`

[](#model-analyzervisualize)

Generates a visual diagram of your model relationships as a standalone file.

```
php artisan model-analyzer:visualize
```

**Options:**

OptionDescription`--output=path`Output file path (default: `model-relationships.html` or `model-erd.html`)`--models=User,Post`Comma-separated list of models to include`--erd`Generate an Entity Relationship Diagram instead of a force-directed graph`--format=html`Output format: `html` (interactive, D3.js) or `svg` (static, embeddable)**Examples:**

```
# Interactive HTML graph (default)
php artisan model-analyzer:visualize

# ERD with table boxes, columns, and crow's foot cardinality
php artisan model-analyzer:visualize --erd

# Static SVG — embeddable in docs, READMEs, presentations
php artisan model-analyzer:visualize --format=svg

# SVG ERD for specific models
php artisan model-analyzer:visualize --erd --format=svg --models=User,Post

# Custom output path
php artisan model-analyzer:visualize --format=svg --output=docs/models.svg
```

**HTML format** produces a standalone file with D3.js — drag nodes, zoom, hover for details.

**SVG format** produces a pure `` file with no JavaScript — lightweight, scalable, and works anywhere images are supported.

---

What It Detects
---------------

[](#what-it-detects)

IssueSeverityDescriptionMissing inverse relationshipWarninge.g. `User hasMany Post` exists but `Post belongsTo User` is missingCircular dependencyErrorTwo models reference each other in a way that creates a loopMissing foreign key columnErrorA relationship references a column that does not exist in the databaseMissing index on foreign keyWarningA foreign key column has no index, which can hurt query performanceHealth Score
------------

[](#health-score)

The `model-analyzer:analyze` and `model-analyzer:health` commands calculate a **0–100 health score** based on the number and severity of issues found relative to the total number of relationships. A score of 100 means no issues were detected.

CI Integration
--------------

[](#ci-integration)

Run the analyzer in strict mode to fail your pipeline when any issue is found:

```
# GitHub Actions example
- name: Analyze models
  run: php artisan model-analyzer:analyze --strict
```

Or allow warnings but fail only on errors (the default):

```
- name: Analyze models
  run: php artisan model-analyzer:analyze
```

Running Tests
-------------

[](#running-tests)

```
composer test
```

License
-------

[](#license)

MIT

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance84

Actively maintained with recent releases

Popularity7

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity51

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

Every ~4 days

Total

13

Last Release

82d ago

Major Versions

v1.0.16 → v2.0.02026-04-12

PHP version history (2 changes)v1.0.1PHP ^7.4|^8.0

v2.0.0PHP ^8.1

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/83569604?v=4)[Lin](/maintainers/dev-lin2)[@dev-lin2](https://github.com/dev-lin2)

---

Top Contributors

[![dev-lin2](https://avatars.githubusercontent.com/u/83569604?v=4)](https://github.com/dev-lin2 "dev-lin2 (18 commits)")

---

Tags

laravelstatic analysisdatabaseeloquentlinterRelationshipsanalyzer

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/devlin-laravel-model-analyzer/health.svg)

```
[![Health](https://phpackages.com/badges/devlin-laravel-model-analyzer/health.svg)](https://phpackages.com/packages/devlin-laravel-model-analyzer)
```

###  Alternatives

[spatie/laravel-medialibrary

Associate files with Eloquent models

6.1k43.2M632](/packages/spatie-laravel-medialibrary)[mongodb/laravel-mongodb

A MongoDB based Eloquent model and Query builder for Laravel

7.1k8.4M96](/packages/mongodb-laravel-mongodb)[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M194](/packages/laravel-ai)[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M346](/packages/psalm-plugin-laravel)[itpathsolutions/dbstan

Database Standardization and Analysis Tool for Laravel

492.9k](/packages/itpathsolutions-dbstan)[calebdw/larastan

Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel

15118.7k4](/packages/calebdw-larastan)

PHPackages © 2026

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