我有一个名为
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'
谢谢
你可以做的是在将 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
插入数据库;
对于新版本的 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);