Сеялка Laravel - проверьте, существует ли уже уникальный слизень - PullRequest
0 голосов
/ 11 ноября 2018

Я заполняю таблицу базы данных («игры») из нескольких CSV-файлов. Таблица имеет отношение «многие ко многим» с другой таблицей («консоли»). Код работает для первого CSV-файла ...

Я ожидаю встретить дубликаты (одна игра может быть выпущена на нескольких платформах).

Вместо исключения из ошибки я сначала хотел бы проверить, существует ли запись (уникальный фрагмент) в таблице базы данных, - если 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,

...

...