2013-07-01 11 views

Odpowiedz

12

OK, zrobiłem to w ten sposób:

// 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); 
}); 

działa jak czar. Otrzymuje zmienne $ categorySlug i $ slug, a następnie używa ich do filtrowania Eloquent Course Course, aby uzyskać prawidłowy obiekt kursu z bazy danych.

EDIT: Można wygenerować URL w widoku jak:

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

Robiąc coś takiego:

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

A mają metodę w mojej kategorii jak poniżej, które pobiera ślimak kategorii nadrzędnej. Można to osiągnąć lepiej, używając choćby klasy prezentera, która pozwoliłaby ci po prostu użyć $ course-> url, ale jeszcze tego nie robiłem. Zaktualizuję odpowiedź, kiedy to zrobię.

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

    return $this->where('id', $parentId)->first()->slug; 
} 
1

Mam również realizowany podobny mapowanie adresów URL, ale wolałem mieć zarówno identyfikator i pocisk w żądanego adresu URL, na przykład:

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

Metoda ta pozwala mi uzyskać zażądał od obiektu ID z adresu URL podanego w argumencie ID, a nie zapisywania wtyczek w tabeli DB.

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

jak mogę dostać ten adres w sterowniku, aby go wyświetlić? – cawecoy

+0

Adresy URL powinny być niepowtarzalne, w tym przypadku otrzymasz to samo dla '/ 1/my-laravel-course' i'/1/lorem-ipsum' na przykład –

3

Jeśli chodzi o mnie, stworzyłem funkcję pomocniczą i wykorzystałem następującą metodę zaczerpniętą z here.

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; 
} 
1

Można utworzyć Powiązany model Slug i zbliżyć kurs w swoich metodach tak:

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