laravel - 添加独特的slug以防止创建重复条目的解决方案是什么?
问题描述
我正在为我的家庭作业做一个项目,我试图让它作为一个水疗中心工作,但我在为帖子制作 slug 时遇到了一些问题。
在我遵循的教程中,讲师使用它从标题中制作了一个 slug:
protected static function boot()
{
parent::boot();
static::creating(function ($course){
$course->slug = str_slug($course->name);
});
}
现在,如果我让这张桌子独一无二,这就是我想做的。我应该如何防止应用程序给我重复输入?或者我怎样才能在 slug 中添加一些东西,比如一个数字,每次我得到重复的条目?
如果我两次用This Post
名字发帖,第二次,我得到重复的错误。
解决方案
在我看来,您选择的答案并没有接近有效的答案。在大型应用程序中,可以在短时间内覆盖 2 个随机字符串,然后您将遇到巨大的问题(代码和数据库)。
一种更安全的方法是构建服务并在将 slug 保存在数据库中时使用它。或者当然这不是 100% 完美,但绝对比增加 2 个随机字符串更好。顺便说一句,这也会影响应用程序的 SEO 部分。您可以在下面找到我的示例:
该模型
public static function boot()
{
parent::boot();
static::saving(function ($model) {
$slug = new Slug();
$model->slug = $slug->createSlug($model->title);
});
}
服务
<?php
namespace App\Services;
use App\Job;
class Slug
{
/**
* @param $title
* @param int $id
* @return string
* @throws \Exception
*/
public function createSlug($title, $id = 0)
{
// Normalize the title
$slug = str_slug($title);
// Get any that could possibly be related.
// This cuts the queries down by doing it once.
$allSlugs = $this->getRelatedSlugs($slug, $id);
// If we haven't used it before then we are all good.
if (!$allSlugs->contains('slug', $slug)) {
return $slug;
}
// Just append numbers like a savage until we find not used.
for ($i = 1; $i <= 100; $i++) {
$newSlug = $slug . '-' . $i;
if (!$allSlugs->contains('slug', $newSlug)) {
return $newSlug;
}
}
throw new \Exception('Can not create a unique slug');
}
protected function getRelatedSlugs($slug, $id = 0)
{
return Model::select('slug')->where('slug', 'like', $slug . '%')
->where('id', '<>', $id)
->get();
}
}
推荐阅读
- amazon-web-services - 如何迁移到无服务器(云形成)到 AWS CDK(云开发工具包)
- javascript - 为什么我的计数器递增 3 而不是 1 (JAVASCRIPT)
- c# - C# Preprocesors 指令与(c# 版本)
- python - 自定义python对象的漂亮打印__str__
- python - 安装 AWS EB CLI 时出现问题
- javascript - 如何将对象数组转换为按属性分组的新对象数组?
- python - (Python Snake 游戏)For 循环不画蛇
- angular - 离子 - API 状态 404
- android - React Native CLI 无法确定 Android 项目配置
- java - 基于指定类类型返回值的 Java 通用双函数