paxha/laravel-recursive-relationships

这个Laravel Eloquent扩展通过公共表提供递归关系

v1.1.0 2020-12-17 16:18 UTC

This package is auto-updated.

Last update: 2024-09-18 01:14:05 UTC


README

Build Status StyleCI Total Downloads Latest Stable Version License

介绍

这个Laravel Eloquent扩展通过公共表提供递归关系

安装

composer require paxha/laravel-recursive-relationships

用法

入门

考虑以下表结构用于层次数据

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('parent_id')->nullable();
});

在模型中使用 HasRecursiveRelationships 特性以处理递归关系

class User extends Model
{
    use \RecursiveRelationships\Traits\HasRecursiveRelationships;
}

默认情况下,特性期望一个名为 parent_id 的父键。您可以通过覆盖 getParentKeyName() 来自定义它

class User extends Model
{
    use \RecursiveRelationships\Traits\HasRecursiveRelationships;

    public function getParentKeyName()
    {
        return 'user_id'; // or anything
    }
}

关系

特性提供了各种关系

  • children(): 模型的直接子项。
  • nestedChildren(): 模型的嵌套子项。
  • parent(): 模型的直接父项。
  • nestedParents(): 模型的嵌套父项(按对象)。
$users = User::with('children')->get();

$users = User::with('nestedChildren')->get();

$users = User::with('parent')->get();

$users = User::with('nestedParents')->get();

作用域

特性提供了查询作用域以按树中的位置过滤模型

  • hasChildren(): 有子项的模型。
  • hasParent(): 有父项的模型。
  • leaf(): 没有子项的模型。
  • root(): 没有父项的模型。
$noLeaves = User::hasChildren()->get();

$noRoots = User::hasParent()->get();

$leaves = User::leaf()->get();

$roots = User::root()->get();

函数

特性提供了辅助函数

  • descendents(): 模型的所有子项在单个数组中。
  • ancestors(): 模型的所有父项在单个数组中。
  • siblings(): 父项的其他子项。
$descendents = User::find($id)->descendents();

$ancestors = User::find($id)->ancestors();

$siblings = User::find($id)->siblings();

许可证

这是一个开源的laravel库,许可协议为MIT许可证