首页 > 解决方案 > 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,

...

标签: laravelseedingcsv-import

解决方案


推荐阅读