Php 在可能的情况下使用slug而不是ID
假设用户可以在我的网站上创建帖子,只有在帖子创建之后,slug列才会被设置,直到使用帖子ID检索/编辑/显示。。但是,当设置段塞时,使用段塞Php 在可能的情况下使用slug而不是ID,php,laravel,Php,Laravel,假设用户可以在我的网站上创建帖子,只有在帖子创建之后,slug列才会被设置,直到使用帖子ID检索/编辑/显示。。但是,当设置段塞时,使用段塞 route('posts.edit',$post)//未设置slug/posts/1/edit 路由('posts.edit',$post)//slug已设置/posts/slug/edit 我将resolveRouteBinding()添加到我删除的帖子模型中$this->getRouteKeyName(),并将其替换为(是数值($value)?'id
route('posts.edit',$post)//未设置slug/posts/1/edit
路由('posts.edit',$post)//slug已设置/posts/slug/edit
我将resolveRouteBinding()
添加到我删除的帖子模型中$this->getRouteKeyName()
,并将其替换为(是数值($value)?'id':'slug')
,因此如果值是数值,它可以按id检索帖子,否则它将假定它是slug
公共函数resolveRouteBinding($value,$field=null)
{
返回$this->where($field???(是数值($value)?'id':'slug'),$value)->first();
}
我该如何让拉雷维尔在最终设置时使用slug?更好的方法?我会建议一种更好的方法,它涉及到将所有内容都更改为slug的生成方式 首先,让我推荐一个用于生成slug的第三方库,名为,还有其他类似的库,但出于很多原因,这是我个人的最爱 使用
composer require spatie/laravel slaggable安装后,下一步将遵循文档,了解如何将其集成到需要生成slug的模型中(集成非常简单)
下一步是将以下代码添加到您希望使用slug进行路由的每个模型中:
/**
*获取模型的路由密钥。
*
*@返回字符串
*/
公共函数getRouteKeyName()
{
返回“slug”;
}
这告诉Laravel,当您像这样调用route('posts.edit',$post)
时,使用slug而不是id
你不需要这个:
公共函数resolveRouteBinding($value,$field=null)
{
返回$this->where($field???(是数值($value)?'id':'slug'),$value)->first();
}
…不再
slug是在创建资源时生成的,因此您不必担心资源不可用。而且你也不必担心鼻涕虫的独特性和一大堆其他问题
为了确保没有意外,迁移中的slug字段应该如下所示:$table->string('slug')->unique()代码>,这样如果插入记录时slug不可用,那么MySql将
拒绝它,其次,如果它不是唯一的,考虑到它是一个slug,那么该记录也将被拒绝。谢谢你的回答,但这并不能解决我的问题。创建一个post并将其插入到数据库中,而不使用slug;因此,应该使用post ID。一旦slug被更新(这只能在一段时间后发生),就应该使用它。我看不出你的答案是如何解决我的问题或提供合适的方法的。如果是这样的话,那么你当前的设置很好,唯一缺少的是first或fail
方法……这对你的工作很重要。