【发布时间】:2019-03-11 13:49:05
【问题描述】:
在 Laravel 中,我有一个包含 id、parent_id、slug(自引用)的表,
当我有一个 ID 时,我需要以这样的格式获取它的所有祖先(用“/”分隔)。
level1/level2/level3
但是在没有像“laravel-nestedset”这样的包的情况下以一种有效的方式 ”。
我是这样实现的。
public function parent()
{
return $this->belongsTo('Collection', 'parent_id');
}
public function getParentsAttribute()
{
$parents = collect([]);
$parent = $this->parent;
while(!is_null($parent)) {
$parents->push($parent);
$parent = $parent->parent;
}
return $parents;
}
任何其他有效的方式并用“/”分隔?
【问题讨论】:
-
我认为这已经是一个很好的解决方案。此外,
parents属性返回一个集合(尽管可能是一个普通数组)。然后只需调用$collection->implode('/')将其变为字符串 -
你在数据库中有一个名为 level 的列吗?如果你这样做了,你可以动态构建一个查询来获取所有父母,然后使用
GROUP_CONCAT之类的东西,让数据库做腿部工作 - PS 我不使用 Laravel,但我已经用嵌套集、简单的父子关系完成了这个有点困难,因为您需要为每个级别加入。 -
有什么方法可以使用 eloquent "with()" - Eager loading?
-
@Flame 你的意思是像
return Collection::find(33)->parents->implode('/');? -
抱歉
parent是一个对象,你应该像->implode('yourproperty', '/')一样调用它,其中yourproperty是父对象的一个属性。仅当您的集合只有简单的标量值时,单参数调用才有效
标签: php laravel laravel-5 eloquent