Я заполняю таблицу базы данных («игры») из нескольких 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,
...