Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Laravel:Seeding mehrerer einzigartiger Spalten mit Faker

Ich habe es gelöst

Ich habe viel nach einer Lösung für dieses Problem gesucht und festgestellt, dass viele andere es auch erlebt haben. Wenn Sie nur ein Element am anderen Ende Ihrer Beziehung benötigen, ist es sehr einfach .

Das Hinzufügen der "mehrspaltigen eindeutigen Einschränkung" hat dies kompliziert gemacht. Die einzige Lösung, die ich gefunden habe, war "Vergessen Sie die MySQL-Einschränkung und umgeben Sie die Fabrikerstellung einfach mit einem Try-Catch für PDO-Ausnahmen". Dies fühlte sich wie eine schlechte Lösung an, da andere PDOExceptions ebenfalls abgefangen würden, und es fühlte sich einfach nicht "richtig" an.

Lösung

Damit dies funktioniert, habe ich die Seeder in ImageTableSeeder und ImageTextTableSeeder aufgeteilt, und beide sind sehr einfach. Ihre Ausführungsbefehle sehen beide so aus:

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

Die Magie passiert in der 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,
    ];
});

Das ist es:

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

Wir verwenden die imageId in einem Regexify-Ausdruck und fügen alles hinzu, was auch in unserer eindeutigen Kombination enthalten ist, in diesem Fall getrennt durch ein '-'-Zeichen. Dadurch werden Ergebnisse wie "841-en", "58-bz", "96-xx" usw. generiert, wobei die imageId immer ein echtes Bild in unserer Datenbank oder null ist.

Da wir das eindeutige Tag zusammen mit der Bild-ID an den Sprachcode kleben, wissen wir, dass die Kombination aus der Bild-ID und dem Sprachcode eindeutig ist . Genau das brauchen wir!

Jetzt können wir einfach den erstellten Sprachcode oder ein anderes eindeutiges Feld, das wir generieren wollten, extrahieren mit:

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

Dieser Ansatz hat die folgenden Vorteile:

  • Keine Notwendigkeit, Ausnahmen abzufangen
  • Factories und Seeders können zur besseren Lesbarkeit getrennt werden
  • Code ist kompakt

Der Nachteil hierbei ist, dass Sie nur Tastenkombinationen generieren können, bei denen eine der Tasten als Regex ausgedrückt werden kann. Solange dies möglich ist, scheint dies ein guter Ansatz zur Lösung dieses Problems zu sein.