当前位置:  开发笔记 > 编程语言 > 正文

按slug搜索对象而不是id

如何解决《按slug搜索对象而不是id》经验,为你挑选了3个好方法。

我是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).

尽管如此......仍然没有运气......不确定我是否误解了某些东西是如何起作用的或者发生了什么......所以如果有人对我可能做错了什么或任何可能的事情有任何建议,我将非常感激!:)



1> lagbox..:

您还可以选择使用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 - 路径模型绑定



2> Marcin Nabia..:

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.



3> Sergio Guill..:

也许这个答案有点晚了,但还有另一种方法可以继续使用find方法并使用slug作为表标识符.您必须在模型中将protected $ primaryKey属性设置为'slug'.

class ww_articles extends Model
{
    protected $primaryKey = 'slug';
    ...
}

这将起作用,因为find方法在内部使用Model类中的getQualifiedKeyName方法,该方法使用$ primaryKey属性.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有