我尝试在Laravel(5.4)中使用cviebrock / eloquent-sluggable。我有一个Page模型和一个网站模型。它在Page模型中使用了sluggable。现在,如果我创建一个页面,我想在生成一个slug之前通过列website_id和slug检查唯一性(例如,在标题之后用-1或-2)。看起来我应该使用方法" customizeSlugEngine",但是当我将它添加到Page模型时它不会被调用。
当它正常工作时,我需要通过slug和page id找到页面。在我的pageController(前端)中,我使用:
Page::findBySlug($slug);
如何通过slug和webiste_id找到页面?
答案 0 :(得分:1)
感谢您的评论和解答。
首先,我在问题的第一部分犯了一个错误。我在Laravel上做了一个独特的slug自定义验证,没有网站ID。我改变了它,它的工作正常。
'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();
答案 1 :(得分:0)
或者你可以使用str_slug,如果你只想缓慢
$title = str_slug("Laravel 5 Framework", "-");
//gives laravel-5-framework
MODEL
class News
{
protected $fillable = [
'title', 'body', 'slug',
];
}
CONTROLLER
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
Route::get("news/{slug}","NewsController@ShowbySlug");