gpt4 book ai didi

php - Laravel - 如何从文章标题正确生成独特的 slug?

转载 作者:行者123 更新时间:2023-11-28 23:29:23 31 4
gpt4 key购买 nike

我需要根据文章标题生成独特的 slug。对于匹配的 slug,我想在末尾附加一个数字以使它们独一无二。我根据周围发现的其他工作制作了此功能:

static function slugify($title)
{
$slug = str_slug($title, '-');
//THIS IS THE PROBLEMATIC LINE:
$common = Article::whereRaw("slug RLIKE '^{$slug}(-[0-9]+)?$'")->orderBy('slug', 'desc')->get();
$count = count($common);
if( $count > 0 ){
$last = $common[0];
$broken = explode('-', $last->slug);
$num = $broken[count($broken)-1];
$num = intval($num) + 1;
return $slug.'-'.$num;
} else
return $slug.'-1';
}

问题:如您所见,我尝试使用 Laravel 的 str_slug 函数生成新的 slug,该函数会将字符串转换为 slug 形式。然后,我尝试从数据库中查询现有的 slug,将它们降序排列(高 > 低),并从本质上取有序集中最高的一个。问题是 MySQL 当然将它们排序为字符串,因此 slug-title-9 实际上会被认为高于 slug-title-10 因为它将它们排序为字符并且不是基于末尾数字的值。我怎样才能使这项工作?有没有一种方法可以根据最后一个数字对它们进行排序,还是我走错了方向?

我想避免的解决方案:

我见过其他实现,其中人们一次查询所有类似的 slug,对它们进行计数,然后将 count+1 附加到新 slug 的末尾。 这很糟糕,因为如果您删除一些文章,总计数会降低,并且新 slug 可能会与旧 slug 冲突。

我见过一个实现,其中一个人将 1 附加到 slug 的末尾并检查它是否存在。如果它存在,他们将改为追加 2 并尝试检查它是否存在等等,直到他们找到例如 slug-title-9 不存在。 IMO 这很糟糕,因为您给数据库带来了不必要的压力。

我需要一个合适的解决方案,因为我正在从事的项目很有可能经常遇到匹配的 slug。

最佳答案

lastInsertId返回id的per-connection,意味着并发sql连接不会互相干扰。

但是,无论您正在做什么,lastInsertId() 可能都不是最佳方法。我看到你已经在使用 Eloquent 模型了。当在表中创建一个新条目时,这些模型返回相应的对象,然后您可以准确地获得该对象的 ID,而不会造成任何混淆。

$article = Article::create(['title' => 'First post', 'content' => '...']);
echo $article->id;

这将始终输出正确的文章 ID,您不必担心实现细节。我看不出在现代 Web 框架中使用 lastInsertId 的充分理由,除了极少数边缘情况。

作为一般规则,尽量避免在您的应用程序中直接处理数据库并使用框架提供的抽象 - 这将使您的代码更易于维护和更容易理解。

附言这对您来说可能并不重要,但 lastInsertId() 不适用于事务。

关于php - Laravel - 如何从文章标题正确生成独特的 slug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37859974/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com