sql >> Database >  >> RDS >> Mysql

Laravel:meerdere unieke kolommen zaaien met Faker

Ik heb het opgelost

Ik heb veel gezocht naar een oplossing voor dit probleem en ontdekte dat vele anderen er ook last van hadden. Als je maar één element aan de andere kant van je relatie nodig hebt, het is heel eenvoudig .

De toevoeging van de "unieke beperking met meerdere kolommen" maakte dit gecompliceerd. De enige oplossing die ik vond was "Vergeet de MySQL-beperking en omring de fabriekscreatie gewoon met een try-catch voor PDO-uitzonderingen". Dit voelde als een slechte oplossing omdat andere PDOExceptions ook zouden worden gepakt, en het voelde gewoon niet "goed".

Oplossing

Om dit te laten werken heb ik de seeders verdeeld in ImageTableSeeder en ImageTextTableSeeder, en ze zijn allebei erg eenvoudig. Hun run-commando's zien er beide als volgt uit:

public function run()
{
    factory(App\Models\ImageText::class, 100)->create();
}

De magie gebeurt in de ImageTextFactory:

$factory->define(App\Models\ImageText::class, function (Faker\Generator $faker) {

    // Pick an image to attach to
    $image = App\Models\Image::inRandomOrder()->first();
    $image instanceof App\Models\Image ? $imageId = $image->id : $imageId = null;

    // Generate unique imageId-languageCode combination
    $imageIdAndLanguageCode = $faker->unique()->regexify("/^$imageId-[a-z]{2}");
    $languageCode = explode('-', $imageIdAndLanguageCode)[1];

    return [
        'image_id' => $imageId,
        'language' => $languageCode,
        'title' => $faker->word,
        'text' => $faker->text,
    ];
});

Dit is het:

$imageIdAndLanguageCode = $faker->unique()->regexify("/^$imageId-[a-z]{2}");

We gebruiken de imageId in een regexify-expressie en voegen toe wat ook in onze unieke combinatie zit, in dit geval gescheiden door een '-'-teken. Dit genereert resultaten zoals "841-en", "58-bz", "96-xx" enz. waarbij de imageId altijd een echte afbeelding in onze database is, of null.

Omdat we samen met de imageId de unieke tag aan de taalcode plakken, weten we dat de combinatie van de image_id en de taalcode uniek zal zijn . Dit is precies wat we nodig hebben!

Nu kunnen we eenvoudig de gemaakte taalcode extraheren, of welk ander uniek veld we ook wilden genereren, met:

$languageCode = explode('-', $imageIdAndLanguageCode)[1];

Deze aanpak heeft de volgende voordelen:

  • Het is niet nodig om uitzonderingen te vangen
  • Fabrieken en Seeders kunnen worden gescheiden voor leesbaarheid
  • Code is compact

Het nadeel hiervan is dat je alleen toetscombinaties kunt genereren waarbij een van de toetsen als regex kan worden uitgedrukt. Zolang dat mogelijk is, lijkt dit een goede benadering om dit probleem op te lossen.



  1. Hoe vind je unieke paren uit twee kolommen in SQL?

  2. Voorwaardelijk in MYSQL waar clausule

  3. SQL Server 2008 Rij Tijdstempels invoegen en bijwerken

  4. Hoe MySQL-ruimte controleren?