Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在可能的情况下使用slug而不是ID_Php_Laravel - Fatal编程技术网

Php 在可能的情况下使用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

假设用户可以在我的网站上创建帖子,只有在帖子创建之后,slug列才会被设置,直到使用帖子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
方法……这对你的工作很重要。