首页 > 解决方案 > 添加独特的slug以防止创建重复条目的解决方案是什么?

问题描述

我正在为我的家庭作业做一个项目,我试图让它作为一个水疗中心工作,但我在为帖子制作 slug 时遇到了一些问题。

在我遵循的教程中,讲师使用它从标题中制作了一个 slug:

protected static function boot()
{
    parent::boot();

    static::creating(function ($course){
        $course->slug = str_slug($course->name);
    });
}

现在,如果我让这张桌子独一无二,这就是我想做的。我应该如何防止应用程序给我重复输入?或者我怎样才能在 slug 中添加一些东西,比如一个数字,每次我得到重复的条目?

如果我两次用This Post名字发帖,第二次,我得到重复的错误。

标签: laravel

解决方案


在我看来,您选择的答案并没有接近有效的答案。在大型应用程序中,可以在短时间内覆盖 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();
    }
}

推荐阅读