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