11

我是 Laravel 的相对初学者(使用 5.2.3 版),并且一直在学习 Laracasts 的教程,然后做了一些我自己的实验。

我成功设置了一个通过 ID 从表中获取项目的路由,如下所示

Route::get('/wiseweasel/{id}', 'WiseweaselController@singleArticle');

为简单起见,控制器简单地 dd 的文章

public function singleArticle($id)
{
  $article = ww_articles::find($id);
  dd($article);
}

这工作得很好——我访问例如 /wiseweasel/2 并使用 id2 获取记录的内容。

所以,然后我想使用记录中的 slug 字段而不是 id。因为我知道 ID 方法有效,所以我尝试修改此路由和控制器(也尝试重新创建,但均未成功)所以我现在有:

Route::get('/wiseweasel/{slug}', 'WiseweaselController@singleArticle');

public function singleArticle($slug)
{
  $article = ww_articles::find($slug);
  dd($article);
}

第二条记录的 slug 是“secondarticle”。因此,访问 url /wiseweasel/secondarticle,我希望看到与之前删除的相同记录。相反,我最终得到了 null。

更奇怪的是,使用原始 id 路由 (/wiseweasel/2) 仍然返回记录......当我从路由和控制器中删除了所有跟踪时,我希望这会失败......

这让我想知道这是否可能是一些奇怪的缓存问题?我试过了

php工匠路线:清除

以防路由被缓存。我还尝试重新启动 Apache 和 MySql(我都使用 XAMMP)。

但是仍然没有运气......不确定我是否误解了某些事情的工作原理或正在发生的事情......所以如果有人对我可能做错了什么有任何建议,或者有什么可以尝试的,我将非常感激!:)

4

4 回答 4

41

您还可以选择使用路由模型绑定来处理此问题并将解析的实例注入您的方法中。

使用新的隐式路由模型绑定,您可以告诉模型它应该使用哪个键来进行路由绑定。

// routes
Route::get('/wiseweasel/{article}', 'WiseweaselController@singleArticle');


// Article model
public function getRouteKeyName()
{
    return 'slug';
}

// controller
public function singleArticle(Article $article)
{
    dd($article);
}

Laravel Docs - 路由模型绑定

于 2015-12-27T22:16:37.590 回答
16

Laravel 不会自动知道slug它应该以不同的方式搜索记录。

当您使用时:

$article = ww_articles::find($slug);

你在告诉 Laravel -www_articles通过 ID 查找记录。(不管你称这个id为$slug)。

要实现您想要的更改:

$article = ww_articles::find($slug);

进入

$article = ww_articles::where('slug', $slug)->first();

这将解决问题(用于slug将列的名称放入数据库中的表中)。当然请记住,在这种情况下,slug 在所有记录中应该是唯一的,否则您将无法获得所有 slug。

于 2015-12-27T21:53:11.377 回答
7

也许答案有点晚了,但是还有另一种方法可以继续使用 find 方法并使用slug作为表标识符。您必须在模型中将受保护的$primaryKey属性设置为“slug”

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

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

于 2015-12-28T21:05:25.803 回答
0

如果你有两条这样的路线

Route::get('/wiseweasel/{id}', 'WiseweaselController@singleArticle');
Route::get('/wiseweasel/{slug}', 'WiseweaselController@singleArticle');

它将始终使用第一个。显然,没有 id 'secondarticle',所以它返回 null(尽管在这种情况下它并不重要,它们都指向同一个方法)。

原因是 route 将搜索可能的路线,直到找到匹配项,该匹配项始终是具有 {id} 的那个。为什么?你没有告诉 Route {id} 必须匹配一个整数!

您可以确保 {id} 被理解为整数,但是我建议使用这样的 url 是一个更好的选择

/wiseweasel/{id}/{slug?}

另一个建议。不要为模型使用诸如 xx_articles 之类的名称,而应使用 Article。这样您就可以使用新的隐式路由绑定。所以使用隐式路由绑定你的 url 看起来像这样(假设你的模型被称为 Article)

Route::get('/wiseweasel/{article}', 'WiseweaselController@singleArticle');
于 2015-12-27T21:52:59.287 回答