我想映射这种类型的路线:
/images/united-states/san-francisco
在我的routes.php
文件中,我写道:
Route::get('/images/{country_slug}/{city_slug}', 'ImageController@listByCountryAndCity');
在我的控制器中:
public function listByCountryAndCity($country, $city)
{
return Image::where('country', $country)->where('city', $city)->paginate();
}
在比较之前,如何 slug 国家/地区?
我不想添加任何其他名为国家/地区或城市
的表格答案 0 :(得分:3)
你不能,至少不能以任何可靠的方式。
因为标题可以包含不是URL安全的特殊字符,并且如果您使用例如str_slug
来生成slug,那么这些特殊字符将被删除,因此您将无法重建标题对于查询条件,因为会丢失字符。
所以唯一的解决方案是在数据库中有一个slug
列,这是一个很好的解决方案。如果您认为为slug添加额外的列是多余的,它不是。虽然标题和URL slug是相似的(并且在这种情况下彼此依赖),但它们是两个独立的实体,并且它们只是合乎逻辑地对待它们。
拥有slug
列可提供您需要的确切功能,还可以为条目设置任何自定义slug,而不仅仅是从标题生成的。
答案 1 :(得分:2)
在像你这样的情况下,我会做这样的路线:
Route::get('/post/{id}-{slug}', 'PostController@show');
在你的控制器中:
public function show($id, $slug)
{
return Post::find($id);
}
所以slu is仅适用于SEO,你只能使用$id
或者,你可以创建一个范围:
public function scopeFindBySlug($query, $title)
{
$query->where('slug', '=', str_slug($title));
}
Post::findBySlug($title)->first();
答案 2 :(得分:0)
您可以使用laravel函数str_slug($string)
中的构建。
但请注意,此功能不会检查slug是否已被占用。它只是将你的字符串转换成一个slug。