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()
函数中实现?可能吗?
您需要像这样在模型顶部使用 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'
]
];
}
}
我假设您的问题是询问如何为可以通过 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
、_rgt
和 parent_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;
我在 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()
函数中实现?可能吗?
您需要像这样在模型顶部使用 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'
]
];
}
}
我假设您的问题是询问如何为可以通过 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
、_rgt
和 parent_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;