Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Laravel:Rozsiewanie wielu unikalnych kolumn za pomocą Fakera

Rozwiązałem to

Dużo szukałem rozwiązania tego problemu i odkryłem, że wielu innych również go doświadczyło. Jeśli potrzebujesz tylko jednego elementu na drugim końcu swojej relacji, to bardzo proste .

Dodanie „ograniczenia wielokolumnowego unikatowego” jest tym, co komplikuje sprawę. Jedynym rozwiązaniem, które znalazłem, było „Zapomnij o ograniczeniu MySQL i po prostu otocz tworzenie fabryki za pomocą try-catch dla wyjątków PDO”. Wydawało się to złym rozwiązaniem, ponieważ inne wyjątki PDO również zostałyby złapane, a to po prostu nie wydawało się „właściwe”.

Rozwiązanie

Aby to zadziałało, podzieliłem seedery na ImageTableSeeder i ImageTextTableSeeder i oba są bardzo proste. Ich polecenia uruchamiania wyglądają tak:

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

Magia dzieje się w 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,
    ];
});

To jest to:

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

Używamy imageId w wyrażeniu regexify i dodajemy wszystko, co jest również zawarte w naszej unikalnej kombinacji, oddzielone w tym przypadku znakiem „-”. Spowoduje to wygenerowanie wyników takich jak „841-en”, „58-bz”, „96-xx” itp., gdzie imageId jest zawsze prawdziwym obrazem w naszej bazie danych lub ma wartość null.

Ponieważ przyklejamy unikalny tag do kodu języka razem z imageId, wiemy, że połączenie image_id i languageCode będzie unikalne . Właśnie tego potrzebujemy!

Teraz możemy po prostu wyodrębnić utworzony kod języka lub jakiekolwiek inne unikalne pole, które chcieliśmy wygenerować, za pomocą:

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

Takie podejście ma następujące zalety:

  • Nie trzeba łapać wyjątków
  • Fabryki i siewniki można oddzielić w celu zapewnienia czytelności
  • Kod jest zwarty

Wadą jest to, że można generować tylko kombinacje klawiszy, w których jeden z kluczy może być wyrażony jako wyrażenie regularne. Tak długo, jak to możliwe, wydaje się to dobrym podejściem do rozwiązania tego problemu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL MONTHNAME() z liczb

  2. Co to znaczy wybrać 1 z tabeli?

  3. Jak dodać niestandardową kolumnę w siatce sprzedaży/zamówień w Magento?

  4. Numeracja wierszy mysql resetuje wszystkie inne wartości rekordów

  5. Konsola administracyjna Glassfish zgłasza wyjątek java.lang.IllegalStateException podczas tworzenia puli JDBC