关系id的雄辩 - 可缓慢的唯一性测试

时间:2017-03-03 20:54:43

标签: php laravel eloquent slug

我尝试在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找到页面?

2 个答案:

答案 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");