sql >> Databáze >  >> RDS >> Mysql

Laravel:Osévání více jedinečných sloupců pomocí Faker

Vyřešil jsem to

Hodně jsem hledal řešení tohoto problému a zjistil jsem, že to zažilo i mnoho dalších. Pokud potřebujete pouze jeden prvek na druhém konci vašeho vztahu, je to velmi přímočaré .

Toto zkomplikovalo přidání „unikátního omezení pro více sloupců“. Jediné řešení, které jsem našel, bylo "Zapomeňte na omezení MySQL a prostě obklopte tovární tvorbu pokusným úlovkem pro výjimky PDO". To mi připadalo jako špatné řešení, protože ostatní PDOExceptions by se také chytily, a to prostě nebylo "správné".

Řešení

Aby to fungovalo, rozdělil jsem secí programy na ImageTableSeeder a ImageTextTableSeeder a oba jsou velmi přímočaré. Jejich příkazy spuštění vypadají oba takto:

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

Kouzlo se odehrává uvnitř 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,
    ];
});

Tohle je ono:

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

Použijeme imageId ve výrazu regexify a přidáme vše, co je také zahrnuto v naší jedinečné kombinaci, v tomto případě oddělené znakem '-'. To vygeneruje výsledky jako "841-en", "58-bz", "96-xx" atd., kde imageId je vždy skutečný obrázek v naší databázi nebo null.

Vzhledem k tomu, že jedinečný tag vkládáme do kódu jazyka společně s imageId, víme, že kombinace image_id a languageCode bude jedinečná . To je přesně to, co potřebujeme!

Nyní můžeme jednoduše extrahovat vytvořený kód jazyka nebo jakékoli jiné jedinečné pole, které jsme chtěli vygenerovat, pomocí:

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

Tento přístup má následující výhody:

  • Není třeba chytat výjimky
  • Továrny a secí stroje lze z důvodu čitelnosti oddělit
  • Kód je kompaktní

Nevýhodou je, že můžete generovat pouze kombinace klíčů, kde lze jeden z klíčů vyjádřit jako regulární výraz. Dokud je to možné, zdá se to jako dobrý přístup k řešení tohoto problému.



  1. Jak propojit GraphQL a PostgreSQL

  2. Jak provádět stránkování s mybatis?

  3. Formátovat výsledky dotazu SQLite jako tabulku HTML

  4. MySQL, utf8_general_ci a cyrilice