2016-06-23 6 views
2

Ich habe Artikel Modell und Artikel Tabelle in der Datenbank. Jeder Artikel kann unter Verwendung der Standard-URI-Struktur von Laravel gezeigt werden: www.example.com/articles/5 (wobei 5 der Artikel id ist). Jeder Artikel hat eine Slug Feld (Slug Spalt in der Artikel-Tabelle), so mit Strecke Modell Bindung Ich benutze slug statt id:Laravel Route Modellbindung (Slug) funktioniert nur für show-Methode?

RouteServiceProvider.php:

public function boot(Router $router) 
{ 
    parent::boot($router); 

    \Route::bind('articles', function($slug) { 
     return \App\Article::where('slug', $slug)->firstOrFail(); 
    }); 
} 

In routes.php habe ich:

Route::resource('articles', 'ArticleController'); 

und jetzt können Artikel mit URLs wie folgt aufgerufen werden: www.example.com/some_slug.

Aber jetzt, wenn ich einige Artikel bearbeiten möchten, bekomme ich folgende Fehlermeldung:

keine Abfrageergebnisse für das Modell [App \ Artikel].

Zum Beispiel, wenn ich versuche, Folgendes zu öffnen: www.example.com/some_slug/edit - ich bekomme diesen Fehler.

Also, Methode ArticleController @ Show (Artikel $ Artikel) funktioniert gut, aber ArticleController @ bearbeiten (Artikel $ Artikel) funktioniert nicht.

Hier ist meine Routenliste:

Rote List

und hier sind zeigen und Bearbeiten von Methoden von Article:

public function show(Article $article) // THIS WORKS FINE 
{ 
    $tags = $article->tags()->get(); 
    return view('articles.show', compact('article', 'tags')); 
} 

public function edit(Article $article) // DOESN'T WORK -> When I open article/slug/edit I get error: No query results for model [App\Article]. 
{ 
    $tags = Tag::lists('name', 'id'); 
    $categories = Category::orderBy('lft', 'asc')->get()->lists('padded_name', 'id'); 
    return view('articles.edit', compact('article', 'tags', 'categories')); 
} 
+0

Sie das 'S' am Ende des 'edit' Parameter sind vermisst. Sollte 'edit (Artikel $ articles)' nicht 'edit (Artikel $ article)' sein, um '/ articles/{articles}' zu entsprechen –

Antwort

1

ich in 5.2 glauben, können Sie den Schlüsselnamen anpassen direkt im Modell unter Verwendung der getRouteKeyName Methode:

public function getRouteKeyName() 
{ 
    return 'slug'; 
} 

docs

1

Ich habe einen anderen Ansatz für Sie, ohne RouteServiceProvider.php zu berühren. Ich hoffe, es hilft.
Sie benötigen verwenden App \ Article; und verwenden App \ Tag; in Ihrem ArticleController.
Article

public function show($slug) 
    { 
     $article = Article::where('slug', $slug)->first(); 

     $tags = Tag::lists('name', 'id'); 

     return view('articles.edit', compact('article', 'tags')); 
    } 

public function edit($slug) 
    { 
     $article = Article::where('slug', $slug)->first(); 

     $tags = Tag::lists('name', 'id'); 

     return view('articles.edit', compact('article', 'tags')); 
    } 
Verwandte Themen