laravel - Laravel 播种器 - 检查是否已经存在唯一的 slug
问题描述
我正在从几个 csv 文件中播种数据库表(“游戏”)。该表与另一个表(“控制台”)具有多对多关系。该代码适用于第一个 csv 文件...
我预计会遇到重复(一个游戏可能会在多个平台上发布)。
而不是错误异常,我首先想检查数据库表中是否已经存在记录(唯一的 slug) - 如果已经使用了 slug,只需更新与现有记录的关系,将数据透视表与新控制台同步(我相信这是附加还是同步?) - 如果不是 - 创建一个新记录。
模型/模式设置如下:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateGamesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('games', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->string('slug')->unique();
...
一个示例播种器代码是
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class SnesGamesSeeder extends Seeder
{
public function run()
{
// Fetch the data from our CSV File
$data = $this->seedFromCSV(base_path('/database/seeds/csvs/snes-csv-filtered.csv'), ',');
foreach ($data as $game)
{
$title = $game['Title'];
$slug = Str::slug($title)
$date = strtotime($game['release_date']);
$format_date = date('Y-m-d',$date);
DB::table('games')->insert(
[
'title' => $title,
'slug' => $slug,
'release_date' => $format_date,
...
我希望能够做类似的事情
foreach ($data as $game)
{
$title = $game['Title'];
$slug = Str::slug($title)
**if(*** $slug already exists in 'game' table){
(find ID) -> ->consoles()->attach(5);
} else {**
DB::table('games')->insert(
[
'title' => $game['Title'],
'slug' => Str::slug($game['Title']),
'release_date' => $format_date,
...
解决方案
推荐阅读
- javascript - 将数组中的某些字符串大写
- hadoop - 本地系统的文件何时移动到 HDFS
- text-to-speech - 是否可以在使用 SpeechSynthesisUtterance API 时选择正在阅读的单词?
- fonts - 强制 fontconfig 为给定字形使用特定字体
- angular - angular2-csv:是否可以添加 CSS 类?
- automated-tests - 在 Win32 应用程序 ObjectSpy 上的 QTP 编写测试未找到对象 ID
- python - 无法使用 Python 会话请求登录网站
- r - If else 语句由当前星期几驱动
- verilog - 在verilog中组合位
- swift - UITabBarButton 没有使用accessibilityIdentifier