laravel模型中的自定义路径

时间:2017-11-21 20:30:09

标签: php laravel-5 laravel-routing

我在laravel 5.5中有2个模型

带有2个功能的

Article.php 类:

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') ;
}

类别表:

id /  article_id  / parent_id / name

现在,例如,对于此视图中的代码:{{ $article->path() }}

it prints:  `example.com/article_slug`

但我想要像这样的东西:

  

example.com/parentCategory/subCategory-1 /.../子类别-N / article_slug

我如何在path()函数中执行此操作?有可能吗?

2 个答案:

答案 0 :(得分:1)

我假设您的问题是询问如何通过他们的子弹为可以拥有无​​限数量儿童的类别生成uri。

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

类别表迁移

use Kalnoy\Nestedset\NestedSet;

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

嵌套的设置列会将_lft_rgtparent_id列添加到您的表中。我建议你研究嵌套集模型的工作原理,以便了解左右列的用途。

类别模型

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);

这将返回上述类别的所有祖先,然后为了获得uri你可以做类似的事情:

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

答案 1 :(得分:0)

您需要使用模型顶部的Sluggable Trait,如下所示:

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'
            ]
        ];
    }
}