启用laravel 4 route来读取slug而不是id

时间:2014-04-28 16:44:36

标签: php laravel laravel-4 eloquent

我在laravel中有以下路线。

Route::get('/{id}', 'HomeController@profile')->where('id', '[0-9A-Za-z\-]+');

如果id对应于数据库中的id,例如site.com/23,那么我可以从具有该特定ID的数据库中获取结果。但是,如果我想获取像标题slu :: site.com/this-is-title这样的东西,那么它根本不会起作用。我不知道如何告诉laravel根据数据库id以外的任何内容进行查询。

我的控制器是:

class HomeController extends BaseController{
        public function profile($company_slug){
        $result = Clients::all($company_slug); 
        return View::make("home.profiles", compact("result"));
    }
}

这是我的模板。

@extends("layouts.master")

@section("main-content")
<?php
   {{ $result->company_slug }}
?>

@stop

没有输出。如果我<?php var_dump($result) ?>,我会NULL

但正如我所说,如果我传递了一个id site.com/32,那么我会从数据库a获得该id的结果。

2 个答案:

答案 0 :(得分:3)

您可以使用路线模型:

解决方案1:

Route::bind('profiles', function($value) 
{
    $records = Profiles::where('company_slug', $value)->all();

    if ( ! $records->count())
    {
        App::abort(404);
    }
    else 
    {
        return $records;
    }
});

Route::get('{profiles}', 'HomeController@profile');

class HomeController extends BaseController
{
    public function profile($profiles)
    {
        return View::make("home.profiles")->with('profiles', $profiles);
    }
}

解决方案2:

Route::get('{slug}', 'HomeController@profile');

class HomeController extends BaseController
{
    public function profile($slug)
    {
        return View::make("home.profiles")
            ->with('profiles', Profiles::where('company_slug', $slug)->all());
    }
}

Docu可用here

答案 1 :(得分:1)

class HomeController extends BaseController{
    public function profile($company_slug){
        $result = Clients::where('company_slaug', '=', $company_slug)->get();
        if (empty($result)) {
            //not found
        }
        return View::make("home.profiles", compact("result"));
    }
}