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