web-dev-qa-db-ja.com

Laravel Str :: slugのスラッグ

フロントエンドのURL生成のためにStr :: slugを見て、ルートなどでどのように実装するのか疑問に思っています。たとえば、どのように変更するのでしょうか http://www.example.com/courses/1 から http://www.example.com/courses/this-course

9
Gareth Daine

OK、私はそれをこのようにしました:

// I have a slug field in my courses table and a slug field in my categories table, along with a category_id field in my courses table.

// Route 

Route::get('courses/{categorySlug}/{slug?}', function($categorySlug, $slug) {
    $course = Course::leftJoin('categories', 'categories.id', 'courses.category_id')
        ->where('categories.slug', $categorySlug)
        ->where('courses.slug', $slug)
        ->firstOrFail();

    return View::make('courses.show')->with('course', $course);
});

チャームのように機能します。 $ categorySlug変数と$ slug変数を取得し、それらを使用してEloquentモデルコースをフィルタリングし、データベースから正しいコースオブジェクトを取得します。

[〜#〜] edit [〜#〜]:ビューに次のようなURLを生成できます。

http://www.example.com/courses/it-training/mcse

次のようなことを行うことによって:

<a href="{{ URL::to('courses/'.$course->category->parentCategorySlug($course->category->parent_id).'/'.$course->category->slug.'/'. $course->slug) }}" title="{{ $course->title }}">{{ $course->title }}</a>

親カテゴリのスラッグを取得する、以下のような私のカテゴリのメソッドがあります。これは、$ course-> urlを使用するだけのプレゼンタークラスを使用することでよりよく達成できますが、私はまだこれを実行することに慣れていません。私がそうするとき、私は答えを更新します。

public function parentCategorySlug($parentId)
{
    if ($parentId === '0')
    {
        return $this->slug;
    }

    return $this->where('id', $parentId)->first()->slug;
}
11
Gareth Daine
5
cawecoy

私はヘルパー関数を作成し、 ここ から取得した次のメソッドを使用しました。

 public static function getSlug($title, $model) {
    $slug = Str::slug($title);
    $slugCount = count( $model->whereRaw("url REGEXP '^{$slug}(-[0-9]*)?$'")->get() );
    return ($slugCount > 0) ? "{$slug}-{$slugCount}" : $slug;
}
3
Mr. Crowley

関連するモデルSlugを作成し、次のようにメソッドでコースにアプローチできます。

$course = Slug::where('slug', $slug) -> firstOrFail() -> course;
2
reshetech

同様のURLマッピングも実装しましたが、次のように、要求されたURLにIDとスラッグの両方を含めることをお勧めします。

http://www.example.com/courses/1/my-laravel-course

このメソッドを使用すると、DBテーブルにスラッグを格納するのではなく、URLで指定されたIDから要求されたcourseオブジェクトを取得できます。

Route::post('courses/(:num)/(:any)', function ($courseid, $slug) {
    $course = Course::where('id', '=', $courseid)->get();
    return View::make('courses.show')->with('course', $course);
}
1
deepika jain