第一件事首先!
一两年前,当我在博世(Bosch)的软件工程师中,我的同事带来了这个令人惊叹的自我参考特征解决方案,可以在单个SQL数据库表中绘制关系。他编写了一个很小但非常有效的代码,然后我添加了更改负责保持这种关系的数据库列的名称的能力。
所以,在此处使用Sérgio的所有道具!ðð
用例
大公司倾向于拥有层次结构的嵌套水平。因此,这里的主要目标是创建一个departments
数据库表,以允许人们管理他们想要多少个嵌套的部门。让我们看看示例。
部门1
第1节
团队1
团队2
第2节
...
您可以想象,这扩展到了国家部门,欧洲部门,甚至他们想创建大量人的团队中的一群人。
好吧,我们想为我们的最终用户提供自由地组织他们的团队的自由!
让我们使用下一组数据以将来的示例!
告诉我代码!
让我们潜入代码!以下要点包含我们想要应用自我参考关系的模型中使用的特征。看一看! ð
https://gist.github.com/joaorbrandao/f23c8e4cdf776a2dfe7fd1f75f64f15e
您可以看到,这是一小部分代码,但功能强大,可以完成工作。
使用Laravel的模型relationship methods时,他们将返回关系本身(BelongsTo
,HasMany
,...)。但是,如果我们像属性一样访问它,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
方法非常简单:它检查当前部门是否属于其他部门,如果是,则重复该过程,直到它在该树上找到具有null
的parent_id
值的记录。
// Let's get 'Backend'
$department = Department::find(5);
$root = $department->root; // Product
我希望这对您和我们的团队一样有用!随意使用它! ð
欢呼! ð