我在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()
函数中执行此操作?有可能吗?
答案 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
,_rgt
和parent_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'
]
];
}
}