Laravel 5.5:如果数据库中存在“自动递增”唯一字段

问题描述 投票:0回答:2

我有一个名为

short_urls
的数据库表,其中包含一个 url 列表及其“短”路径。

需要注意的主要字段是:

$table->string('url')->unique();
$table->string('full_path');

我想知道 Laravel 5.5 中是否有一种方法可以自动将数字添加到

url
字段(如果它已经存在)。

例如,如果我要使用

DatabaseSeeder
来填充数据库并为
ModelFactory
创建一个
ShortUrl
,例如:

$factory->define(App\Models\Route::class, function (Faker $faker) {
    return [
        'url'       => $faker->slug,
        'full_path' => $faker->url
    ]
});

在我的

DatabaseSeeder
中我做了类似的事情:

$shortUrl1 = factory(ShortUrl::class)->create([
    'url' => 'my-short-url'
])

$shortUrl2 = factory(ShortUrl::class)->create([
    'url' => 'my-short-url'
])

我想知道是否有办法确保当创建第二个

ShortUrl
时(
$shortUrl2
)...

...它可以自动检测,如果数据库中的记录已经存在,

url
它正在尝试设置...

...然后它应该将其设置为类似

url => 'my-short-url-2'

谢谢

php laravel eloquent laravel-5.5
2个回答
1
投票

你可以做的是在将 url 插入数据库之前强制检查,这样我们就可以知道 url 是否重复,然后相应地附加一个数字,这里是一个示例

然后您可以从控制器调用

    private function getUniqueUrl($url)
    {
        $slug = str_slug(trim($url), '-');

        $existingCount = Url::where('url', 'like', $slug . '-%')->count();

        if($existingCount)
        {
          return $slug . '-' . ($existingCount);
        }

        return $slug
    }

使用

$slug
插入数据库;


0
投票

对于新版本的 Laravel (9),我遇到了类似的问题,我能够通过使用 Observer 来解决它。

这是我的观察者代码:

<?php

namespace App\Observers;

use App\UploadedFile;

class UploadedFileObserver
{
    /**
     * Handle the UploadedFile "creating" event.
     *
     * @param  \App\UploadedFile  $uploadedFile
     * @return void
     */
    public function creating(UploadedFile $uploadedFile)
    {
        // Check if filename exists
        // If it exists, append a number to the end of the filename
        // If that also exists, increment the number by 1 until one is found that does not exist

        $new = $uploadedFile->original_filename;
        $exists = UploadedFile::where('original_filename', $new)->first();
        $count = 1;

        while ($exists) {
            $name      = pathinfo($uploadedFile->original_filename, PATHINFO_FILENAME);
            $extension = pathinfo($uploadedFile->original_filename, PATHINFO_EXTENSION);
            $new       = $name . $count . '.' . $extension;
            $exists    = UploadedFile::where('original_filename', $new)->first();
            $count++;
        }

        $uploadedFile->original_filename = $new;
    }


别忘了在

app/Providers/AppServiceProvider.php

中注册您的观察员
UploadedFile::observe(UploadedFileObserver::class);
© www.soinside.com 2019 - 2024. All rights reserved.