ð自我参考Laravel模型
#php #laravel #sql #relational

第一件事首先!

一两年前,当我在博世(Bosch)的软件工程师中,我的同事带来了这个令人惊叹的自我参考特征解决方案,可以在单个SQL数据库表中绘制关系。他编写了一个很小但非常有效的代码,然后我添加了更改负责保持这种关系的数据库列的名称的能力。
所以,在此处使用Sérgio的所有道具!ðð

用例

大公司倾向于拥有层次结构的嵌套水平。因此,这里的主要目标是创建一个departments数据库表,以允许人们管理他们想要多少个嵌套的部门。让我们看看示例。

部门1

第1节

团队1

团队2

第2节

...

您可以想象,这扩展到了国家部门,欧洲部门,甚至他们想创建大量人的团队中的一群人。
好吧,我们想为我们的最终用户提供自由地组织他们的团队的自由!

让我们使用下一组数据以将来的示例!

departments

告诉我代码!

让我们潜入代码!以下要点包含我们想要应用自我参考关系的模型中使用的特征。看一看! ð

https://gist.github.com/joaorbrandao/f23c8e4cdf776a2dfe7fd1f75f64f15e

您可以看到,这是一小部分代码,但功能强大,可以完成工作。

使用Laravel的模型relationship methods时,他们将返回关系本身(BelongsToHasMany,...)。但是,如果我们像属性一样访问它,Laravel将自动为我们提供相关实体的实例!

让我们在Department模型中利用我们的全新特征。

class Department extends Model {
    use SelfReferenceTrait;
}

父方法

parent方法定义了belongsTo关系。这意味着一个der割可能属于另一个。

parent将返回一个Department实例,当当前部门上面有另一个部门,或者在上面没有更多部门时它将返回null

// Let's get 'Development'
$department = Department::find(3);

$parent = $department->parent; // Product

孩子们的方法

children方法定义了hasMany关系。这意味着部门可以让许多其他部门吼叫。

children将返回一个Collection,其中包含下一个级别波纹管的所有部门。换句话说,其parent_id的部门列表等于当前模型的id。如果上面没有部门,则返回的集合将为空。

// Let's get 'Development'
$department = Department::find(3);

$children = $department->children; // Backend and Frontend

Allchildren方法

allChildren方法利用Laravel的关系方法with急切地加载嵌套的关系。但是在这种情况下,我们没有重新定义我们的新方法内的关系,而是使用已定义的children方法来获取下一个嵌套级别,然后急切地加载我们自己的allChildren关系! “说whaaat?!” ð

好吧,让我变得更容易:我们循环遍历所有嵌套的水平,直到所有孩子都被加载为止! ð

// Let's get 'Backend'
$department = Department::find(5);

$allChildren = $department->allChildren; // Develpment > Backend and Frontend

根方法

root方法非常简单:它检查当前部门是否属于其他部门,如果是,则重复该过程,直到它在该树上找到具有nullparent_id值的记录。

// Let's get 'Backend'
$department = Department::find(5);

$root = $department->root; // Product

我希望这对您和我们的团队一样有用!随意使用它! ð

欢呼! ð