Laravel - 在routes.php中使用'where'来查询模型

时间:2013-12-17 10:49:30

标签: php laravel laravel-routing

我希望为电子商务商店铺平我的路线以进行搜索引擎优化。

我想创建以下路线:

Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry']);
Route::get('/{category}, ['uses' => 'Store\ProductController@browseCategory']')

countrycategory必须是动态的。

我想知道以下内容是否可行?以及实现的最佳方式。

// Route 1
Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry'])
    ->where('country', ProductCountry::select('slug')->get());

// Route 2
Route::get('/{category}', ['uses' => 'Store\ProductController@browseCategory'])
    ->where('category', ProductCategory::select('slug')->get());

示例路线:

/great-britain should be routed via Route 1
/china         should be routed via Route 1

/widgets       should fail route 1, but be routed via Route 2 because 
               widgets are not in the product_country table but are in 
               the product_category table

我知道我可以在可能的国家/地区对我的路线进行硬编码:

Route::get('/{country}', ['uses' => 'Store\ProductController@browse'])
    ->where('country', 'great-britain|china|japan|south-africa');

然而,这是笨拙和愚蠢的。我想从数据库中获取国家列表。

3 个答案:

答案 0 :(得分:1)

我将这样做,我选择国家模型,因为有更少的模型+你需要缓存: 将列表('名称')更改为国家/地区名称列

Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry'])
->where('country', implode('|',ProductCountry::select('slug')->lists('name')));

选择所有国家/地区名称并将其作为数组返回

 ('usa','england','thailand') 

并使用'|'进行内爆当胶水返回时:

usa|england|thailand

所以你的最终路线是这样的:

Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry'])
->where('country', 'usa|england|thailand');

答案 1 :(得分:0)

好的,所以在查看更新后的问题后,您需要在各自的模型中创建一个方法,以便将所有可用的slug连接到|性格,所以你会打电话给:

Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry'])
     ->where('country', ProductCountry::getSlugs());

在你的例子中,这几乎会回归“大英国|中国|日本|南非”,除非你不必写它。

但是,我强烈建议你给路线更多一点,/ country / {country}或/ category / {category}否则会让人感到困惑,而URI结构通常都是这样的,这样用户就可以准确看看他们在哪里。

答案 2 :(得分:0)

您需要路由过滤器来实现这一目标。

将以下代码放入filters.phproute.php文件

Route::filter('country', function()
{

    $country = Country::where('slug', Route::input('country'))->first();
    if(  ! $country) {
        dd("We do not support this country");
            // Redirect::route('home');
    }

});

最后你的路线:

Route::get('country/{country}', array('before' => 'country', 'uses' => 'Store\ProductController@browseCountry'));