mhdobd/eloquent-relation-guard 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

mhdobd/eloquent-relation-guard

最新稳定版本:v0.9.0

Composer 安装命令:

composer require mhdobd/eloquent-relation-guard

包简介

A Laravel package for scanning model relations, And providing useful actions over them

README 文档

README

Package logo

Eloquent Relation Guard

Laravel package by MuhammadObadaa

Scan, inspect, and (optionally) force‐delete Eloquent models along with their HasOne/HasMany branches—without relying on database‐level cascade or restrict rules.

OnDelete, you can walk through a model’s HasOne/HasMany relations (to any depth), get a nested “tree” of related IDs, check whether a model is safe to delete, or forcibly delete the entire sub‐tree in one shot.

Installation

Require the package via Composer:

composer require mhdobd/eloquent-relation-guard

Configuration

Publish the configuration file:

php artisan vendor:publish --provider="EloquentRelation\Guard\EloquentRelationGuardServiceProvider" --tag="config"

This will copy config/eloquent-relation-guard.php into your application’s config/ directory.

Usage

  1. Use the Trait in Your Model Add the HasRelationalDependencies trait to any Eloquent model you want to protect/scan.

    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Relations\HasMany;
    use EloquentRelation\Guard\Traits\HasRelationalDependencies;
    
    class Post extends Model
    {
        use HasRelationalDependencies;
    
        /**
         * By default, all HasOne/HasMany relations will be scanned.
         * If you want to limit or specify nested branches, define:
         */
        protected array $scanRelations = [
            'comments',             // only scan Post::comments()
            'comments.replies',     // also scan replies under each comment
            'tags',                 // scan Post::tags() (if tags is a HasMany relationship)
            '*'                     // or simply, add all first-level relations
        ];
    
        // Type hint (mention the return type of) each HasOne/HasMany relation method
        public function comments(): HasMany
        {
           return $this->hasMany(Comment::class);
        }
    }
  2. Check if a Record Can Be Deleted

    $post = Post::find(42);
    
    if ($post->canBeSafelyDeleted()) {
        // no related HasOne/HasMany records exist
        $post->delete();
    } else {
        // there are related records—perhaps alert the user
        // so you can alert the user with detailed related relations using $post->relationStructure
    }
  3. Get the Full Relation “Tree” (with IDs)

    $post = Post::find(42);
    
    // Pass a depth (integer) to limit how many levels deep to scan.
    // Use -1 for no depth limit, only memory and time one.
    $tree = $post->relationStructure(depth:2);
    // $tree will look like:
    // [
    //   'comments' => [
    //       'ids'   => [10, 11, 12],
    //       'model' => 'App\Models\Comment',
    //       'nested'=> [
    //           'replies' => [
    //               'ids'   => [101, 102],
    //               'model' => 'App\Models\CommentReply',
    //               'nested'=> [ /* … */ ],
    //           ],
    //       ],
    //   ],
    //   'tags' => [
    //       'ids'   => [5, 6],
    //       'model' => 'App\Models\Tag',
    //       'nested'=> [],
    //   ],
    // ]
  4. Force‐Delete a Model and All Related Records

    $post = Post::find(42);
    $deletedCount = $post->forceCascadeDelete();
    // This will delete all HasOne/HasMany descendants (ignoring DB foreign‐key rules)
    // and then delete the Post itself. $deletedCount is the total number of records removed.
  5. Console Command: record:tree You can visualize a model’s relation tree (with IDs) from the CLI:

    php artisan record:tree Post 42 2
    • Post : The model class name, it should be located in app/models/ directory
    • 42 : ID of the record to inspect
    • 2 : Depth (how many nested levels to scan; use -- -1 for unlimited)

    Example Output:

    Relation Tree for App\Models\Post (ID: 42) | Depth: 2
    ├── comments (App\Models\Comment): [10, 11, 12]
    │   └── replies (App\Models\CommentReply): [101, 102]
    └── tags (App\Models\Tag): [5, 6]
    

for more details check the Documentation

TODO

  • Add support for soft deletes (detecting deleted_at and deciding whether to include or ignore soft‐deleted records).
  • Support morph relations along with HasOne and HasMany relations.
  • Allow configurable thresholds for maximum nodes/depth before aborting the scan.
  • Add event hooks (e.g., beforeDeleteGuarded, afterDeleteGuarded) so users can tap into the delete process.
  • Provide Laravel Nova/Filament integrations for visual “Are you sure?” modals.
  • Mark visited classes when DFS over them so it can avoid cyclic database relations.
  • Write feature tests and include sample migrations/seeders.
  • Add Complexity Details in documentation file.
  • Optimize Time, Memory, and DB Query complexity over core package logic implementation.

Contributing

If you discover bugs, have feature requests, or want to contribute code, please use the GitHub issue tracker:

Issues & Contributions: https://github.com/MuhammadObadaa/eloquent-relation-guard/issues

Feel free to fork the repository, open a PR, and follow these basic guidelines:

  1. Fork the repo and create a new branch for your feature/fix.
  2. Write at least one test (where applicable) demonstrating the expected behavior.
  3. Update CHANGELOG.md and README.md if you add or change functionality.
  4. Submit a pull request—describe what you changed and why.

License

Eloquent Relation Guard package is open source, licensed under MIT. Feel free to use, modify, and redistribute.

统计信息

  • 总下载量: 4
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 2
  • 点击次数: 3
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-06-03

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固