Laravel获取祖先(URL) [英] Laravel Get ancestors (URL)

查看:27
本文介绍了Laravel获取祖先(URL)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Laravel中,我有一个表,其中包含id,parent_id,slug(自引用)

In Laravel, I have a table which contains id, parent_id, slug (Self-referring),

当我有一个ID时,我需要以这种格式(由"/"分隔)获取其所有祖先.

When I have an ID, I need to get all its ancestors in a format like this (Separated by "/").

level1/level2/level3

但是没有像"laravel-nestedset"这样的软件包,它是一种有效的方式.

But in an efficient way without a package like "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;
}

是否有其他有效的方法,并用"/"分隔?

Any other way to do it efficiently and separated by "/" ?

推荐答案

在评论中进行一些交谈之后,我认为这是一个很好的解决方案:

After a little conversation in the comments I think this is a good solution:

// YourModel.php

// Add this line of you want the "parents" property to be populated all the time.
protected $appends = ['parents'];

public function getParentsAttribute()
{
    $collection = collect([]);
    $parent = $this->parent;
    while($parent) {
        $collection->push($parent);
        $parent = $parent->parent;
    }

    return $collection;
}

然后您可以使用以下方法找回父母

Then you can retrieve your parents using:

  • YourModel :: find(123)->父母(集合实例)
  • YourModel :: find(123)-> parents-> implode('yourprop','/')(内置于字符串中,请参见
  • YourModel::find(123)->parents (collection instance)
  • YourModel::find(123)->parents->implode('yourprop', '/') (imploded to string, see https://laravel.com/docs/5.4/collections#method-implode)
  • YourModel::find(123)->parents->reverse()->implode('yourprop', '/') (reversed order https://laravel.com/docs/5.4/collections#method-reverse)

如Nikolai Kiselev https://stackoverflow.com/a/55103589/1346367 所述,您也可以将其组合以此保存一些查询:

As noted by Nikolai Kiselev https://stackoverflow.com/a/55103589/1346367 you may also combine it with this to save a few queries:

protected $with = ['parent.parent.parent'];
// or inline:
YourModel::find(123)->with(['parent.parent.parent']);

这会在对象加载时预加载父对象.如果您决定不使用它,则在您调用 $ yourModel->父级时,父级会被(延迟)加载.

This preloads the parent on object load. If you decide not to use this, the parent is (lazy) loaded as soon as you call $yourModel->parent.

这篇关于Laravel获取祖先(URL)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆