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.