我是Laravel的相对初学者(使用版本5.2.3)并且一直在研究Laracasts的教程,然后做了一些我自己的实验.
我成功地设置了一个路由,通过其ID从表中获取项目,如下所示
Route::get('/wiseweasel/{id}', 'WiseweaselController@singleArticle');
为简单起见,控制器只是dd的文章
public function singleArticle($id) { $article = ww_articles::find($id); dd($article); }
这非常正常 - 我访问eg/wiseweasel/2并获取id2的记录内容.
所以,我想使用记录中的slug字段而不是id.既然我知道ID方法正在运行,我已经尝试过修改这个路由和控制器(也尝试重新创建,既没有工作)所以我现在有:
Route::get('/wiseweasel/{slug}', 'WiseweaselController@singleArticle');
和
public function singleArticle($slug) { $article = ww_articles::find($slug); dd($article); }
第二个记录的slu is是"secondarticle".所以,访问url/wiseweasel/secondarticle,我希望看到与之前相同的记录.相反,我最终得到null.
更奇怪的是,使用原始的id路由(/ wiseweasel/2)仍然会返回记录...当我从路由和控制器中删除了所有这些跟踪时,所以我希望这会失败...
这让我想知道这是否可能是一些奇怪的缓存问题?我试过了
php artisan route:清楚
以防路由被缓存.我也尝试重启Apache和MySql(我正在使用XAMMP).
尽管如此......仍然没有运气......不确定我是否误解了某些东西是如何起作用的或者发生了什么......所以如果有人对我可能做错了什么或任何可能的事情有任何建议,我将非常感激!:)
您还可以选择使用Route Model 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 - 路径模型绑定
Laravel不会自动知道slug
它应该以不同的方式搜索记录.
当你使用时:
$article = ww_articles::find($slug);
你在告诉Laravel - www_articles
按身份查找记录.(不管你叫这个id $ slug).
要实现你想要的改变:
$article = ww_articles::find($slug);
成
$article = ww_articles::where('slug', $slug)->first();
这将起到作用(用于slug
将列的名称放在数据库中的表中).当然要记住,在这种情况下,slug应该在所有记录中都是唯一的,否则你将无法获得所有的slu.
也许这个答案有点晚了,但还有另一种方法可以继续使用find方法并使用slug作为表标识符.您必须在模型中将protected $ primaryKey属性设置为'slug'.
class ww_articles extends Model { protected $primaryKey = 'slug'; ... }
这将起作用,因为find方法在内部使用Model类中的getQualifiedKeyName方法,该方法使用$ primaryKey属性.