2016-10-24 11 views
1

Laravel 5.2のプロジェクトで、SEOのフレンドリーなURLを実装し、URL自体からIDのアスペクトを削除しようとしています。SEOフレンドリーなURL Laravel

通常あなたはこのようなものだろう:あなたは、URL「www.mywebsite.com/post/12」でなければなりません

Route::resource('post', 'PostsController'); 

- 今、私はそのことにを交換する場合、ポスト のIDをタイトル、私のコントローラで、私は今データベースのタイトルで検索する必要があります。同じタイトルの記事が2つある場合は、1つ以上のレコードが見つかったのでエラーが表示されます。

私の質問は、SEOフレンドリーなURLと一緒に使用する記事の同じタイトルを許可する方法ですコントローラーのshowメソッド内のこれらの行に沿ったidまたは何かによって。

ご協力いただきありがとうございます。

+1

タイトルは事実上idなので、すべてのタイトルが一意であることを強制する必要があります。他の選択肢はありません。それ以外の場合、 'example.com/article/himom'は素晴らしいファジータのレシピを指していますが、全く同じ' example.com/article/himom'は心のこもった母親の1日の挨拶を指しています。 –

+0

私はあなたが何を意味しているのか知っていますが、同じタイトルの記事を投稿できるようにする方法はありますか? – max234435

+1

私はslugというテーブルに新しいフィールドを追加し、それを一意のフィールドとして使用します。その後、同じタイトルを持つことができますが、異なるスラグを持つことができます。 – Chris

答えて

1

コメントに記載されているように、slugというuniqueという列をデータベーステーブルに追加することができます。

nullableを作成し、Postが作成された後にスラグを生成する方法があります。あなたのPostモデルで

は、以下を追加します。Postが作成されると

/** 
* Boot the model 
*/ 
public static function boot() 
{ 
    static::created(function ($post) { 

     $post->generateSlug(); 

    }); 
} 

/** 
* Generate the slug for the newly created Post 
*/ 
protected function generateSlug() 
{ 
    $slug = str_slug($this->slug); 

    if (static::slug($slug)->exists()) { 
     $slug .= '-' . $this->id; 
    } 

    $this->slug = $slug; 
    $this->save(); 
} 

/** 
* Get the route key for the model. 
* 
* @return string 
*/ 
public function getRouteKeyName() 
{ 
    return 'slug'; 
} 

/** 
* Constrain the query to the provided slug 
* 
* @param $query 
* @param $slug 
* @return mixed 
*/ 
public function scopeSlug($query, $slug) 
{ 
    return $query->where('slug', $slug); 
} 

ので、generateSlugメソッドが呼び出されます。これにより、Postのタイトルからスラッグが作成されます。次に、Postに既にそのスラッグがあるかどうかを確認するだけで、Postidが末尾に追加されます。それはそれを保存します。 getRouteKeyNameメソッドは、Route::resourceidではなくslugフィールドを自動的に使用してモデルを解決するという意味です。

明らかに、slugをユニークにする方法を変更してもよろしいですか?簡単な例として、idを使用しました。

希望すると便利です。

関連する問題