eloquent-sluggable 通过关系 id 进行唯一性测试
eloquent-sluggable uniqueness test by relationship id
我尝试在 Laravel (5.4) 中使用 cviebrock/eloquent-sluggable。我有一个页面模型和一个网站模型。它在 Page 模型中使用 sluggable。现在,如果我创建一个页面,我想在生成 slug 之前通过列 website_id 和 slug 检查唯一性(例如,在标题后使用 -1 或 -2)。看起来我应该使用方法 "customizeSlugEngine",但是当我将它添加到页面模型时它没有被调用。
当它工作时,我需要通过 slug 和页面 id 来查找页面。在我的 pageController (front-end) 中,我使用:
Page::findBySlug($slug);
如何通过 slug 和 webiste_id 查找页面?
Alternatively you can use str_slug if you just want to sluggify
$title = str_slug("Laravel 5 Framework", "-");
//gives laravel-5-framework
型号
class News
{
protected $fillable = [
'title', 'body', 'slug',
];
}
控制器
public function store(Request $request)
{
$news = new News();
$news->title = $request->input("title");
$news->body = $request->input("body");
$news->slug = str_slug($request->input("title"));//you can append current date and time to make unique slug
$news->save();
}
/**
* Display the specified news by slug.
*
* @param $slug
* @return Response
*/
public function ShowbySlug($slug)
{
$news = News::where("slug",'=',$slug);
return view('news.show', compact('news'));
}
路线
Route::get("news/{slug}","NewsController@ShowbySlug");
感谢您的评论和回答。
首先,我在问题的第一部分犯了一个错误。我在 Laravel 中对一个没有网站 ID 的唯一 slug 进行了自定义验证。我改变了这个,它工作正常。
'slug' => 'unique:pages,slug,NULL,pages,website_id,'.\Request::get('website_id'),
模型需要函数 "scopeWithUniqueSlugConstraints" 在生成之前检查多列。
public function website()
{
return $this->belongsTo('App\Models\Website');
}
public function scopeWithUniqueSlugConstraints(Builder $query, Model $model, $attribute, $config, $slug)
{
$website = $model->website;
return $query->where('website_id', $website->getKey());
}
在我的 pageController(前端)中,我调用页面:
Page::whereSlug($slug)->where('website_id', '=', $website_id)->first();
我尝试在 Laravel (5.4) 中使用 cviebrock/eloquent-sluggable。我有一个页面模型和一个网站模型。它在 Page 模型中使用 sluggable。现在,如果我创建一个页面,我想在生成 slug 之前通过列 website_id 和 slug 检查唯一性(例如,在标题后使用 -1 或 -2)。看起来我应该使用方法 "customizeSlugEngine",但是当我将它添加到页面模型时它没有被调用。
当它工作时,我需要通过 slug 和页面 id 来查找页面。在我的 pageController (front-end) 中,我使用:
Page::findBySlug($slug);
如何通过 slug 和 webiste_id 查找页面?
Alternatively you can use str_slug if you just want to sluggify
$title = str_slug("Laravel 5 Framework", "-");
//gives laravel-5-framework
型号
class News
{
protected $fillable = [
'title', 'body', 'slug',
];
}
控制器
public function store(Request $request)
{
$news = new News();
$news->title = $request->input("title");
$news->body = $request->input("body");
$news->slug = str_slug($request->input("title"));//you can append current date and time to make unique slug
$news->save();
}
/**
* Display the specified news by slug.
*
* @param $slug
* @return Response
*/
public function ShowbySlug($slug)
{
$news = News::where("slug",'=',$slug);
return view('news.show', compact('news'));
}
路线
Route::get("news/{slug}","NewsController@ShowbySlug");
感谢您的评论和回答。
首先,我在问题的第一部分犯了一个错误。我在 Laravel 中对一个没有网站 ID 的唯一 slug 进行了自定义验证。我改变了这个,它工作正常。
'slug' => 'unique:pages,slug,NULL,pages,website_id,'.\Request::get('website_id'),
模型需要函数 "scopeWithUniqueSlugConstraints" 在生成之前检查多列。
public function website()
{
return $this->belongsTo('App\Models\Website');
}
public function scopeWithUniqueSlugConstraints(Builder $query, Model $model, $attribute, $config, $slug)
{
$website = $model->website;
return $query->where('website_id', $website->getKey());
}
在我的 pageController(前端)中,我调用页面:
Page::whereSlug($slug)->where('website_id', '=', $website_id)->first();