laravel 模型中的自定义路径

custom path in laravel model

我在 laravel 5.5

中有 2 个模型

Article.php class 具有 2 个函数:

public function sluggable()
{
    return [
        'slug' => [
            'source' => 'title'
        ]
    ];
}

public function path()
{
    return "/$this->slug";
}

Category.php

public function childs() {
      return $this->hasMany('App\Category','parent_id','id') ;
}

类别table:

id /  article_id  / parent_id / name

现在举例,对于这段代码:{{ $article->path() }}

it prints:  `example.com/article_slug`

但我想要这样的东西:

example.com/parentCategory/subCategory-1/.../subCategory-n/article_slug

如何在 path() 函数中实现?可能吗?

您需要像这样在模型顶部使用 SluggableTrait :

use Cviebrock\EloquentSluggable\Sluggable;

class Post extends Model
{
    use Sluggable;

    /**
     * Return the sluggable configuration array for this model.
     *
     * @return array
     */
    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title'
            ]
        ];
    }
}

我假设您的问题是询问如何为可以通过 slug 拥有无限数量子项的类别生成 uri。

我将如何处理这样的事情是通过在 MySQL 中使用分层数据模式,这将允许您通过执行一个查询来获取后代/祖先列表。有很多方法可以实现这一点,但出于解释的目的,我将解释如何使用嵌套集模式来实现它。更具体地说,我将演示如何使用 lazychaser 的嵌套集 package.

类别Table迁移

use Kalnoy\Nestedset\NestedSet;

Schema::create('categories', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    NestedSet::columns($table);
    $table->timestamps();
});

嵌套的集合列会将 _lft_rgtparent_id 列添加到您的 table。我建议您研究一下嵌套集模型的工作原理,以便了解左右列的用途。

类别模型

use Kalnoy\Nestedset\NodeTrait;

class Category extends Model
{
    use NodeTrait;

    //
}

现在您可以像这样创建一个子类别:

$parentCategory = Category::first();

$parentCategory->children()->create([
    'name' => 'Example Category'
]);

这意味着在深度嵌套的类别中,您可以执行以下操作:

$categories = Category::ancestorsAndSelf($article->category_id);

这将 return 上述类别的所有祖先,然后要获取 uri,您可以执行以下操作:

$uri = $categories->pluck('slug')->implode('/') . '/' . $article->slug;