Search object by slug and not by id

You also have the option of using Route Model Binding to take care of this and inject the resolved instance into your methods.

With the new implicit Route Model Binding you can tell the model what key it should use for route binding.

// routes
Route::get('/wiseweasel/{article}', 'WiseweaselController@singleArticle');


// Article model
public function getRouteKeyName()
{
    return 'slug';
}

// controller
public function singleArticle(Article $article)
{
    dd($article);
}

Laravel Docs - Route Model Binding


Maybe it's a bit late for the answer but there is another way to keep using find method and use slug as your table identifier. You have to set the protected $primaryKey property to 'slug' in your model.

class ww_articles extends Model
{
    protected $primaryKey = 'slug';
    ...
}

This will work because find method internally uses the getQualifiedKeyName method from Model class which uses the $primaryKey property.


Laravel won't automatically know that for slug it should search record in different way.

When you are using:

$article = ww_articles::find($slug);

you are telling Laravel - find record of www_articles by ID. (no matter you call this id $slug).

To achieve what you want change:

$article = ww_articles::find($slug);

into

$article = ww_articles::where('slug', $slug)->first();

This will do the trick (for slug put the name of column in table in database). Of course remember that in this case slug should be unique in all records or you won't be able to get all the slugs.