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.