Saya menyelesaikannya
Saya banyak mencari solusi untuk masalah ini dan menemukan bahwa banyak orang lain juga mengalaminya. Jika Anda hanya membutuhkan satu elemen di ujung lain relasi Anda, itu sangat mudah .
Penambahan "pembatasan unik multi kolom" adalah yang membuat ini rumit. Satu-satunya solusi yang saya temukan adalah "Lupakan pembatasan MySQL dan kelilingi pembuatan pabrik dengan coba-tangkap untuk pengecualian PDO". Ini terasa seperti solusi yang buruk karena PDOExceptions lainnya juga akan ketahuan, dan itu tidak terasa "benar".
Solusi
Untuk membuat ini berfungsi, saya membagi seeder ke ImageTableSeeder dan ImageTextTableSeeder, dan keduanya sangat lurus ke depan. Perintah run keduanya terlihat seperti ini:
public function run()
{
factory(App\Models\ImageText::class, 100)->create();
}
Keajaiban terjadi di dalam 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,
];
});
Ini dia:
$imageIdAndLanguageCode = $faker->unique()->regexify("/^$imageId-[a-z]{2}");
Kami menggunakan imageId dalam ekspresi regexify dan menambahkan apa pun yang juga termasuk dalam kombinasi unik kami, dalam hal ini dipisahkan dengan karakter '-'. Ini akan menghasilkan hasil seperti "841-en", "58-bz", "96-xx" dll. Di mana imageId selalu merupakan gambar asli dalam database kami, atau null.
Karena kita menempelkan tag unik ke kode bahasa bersama dengan imageId, kita tahu bahwa kombinasi image_id dan languageCode akan unik . Inilah yang kami butuhkan!
Sekarang kita cukup mengekstrak kode bahasa yang dibuat, atau bidang unik apa pun yang ingin kita buat, dengan:
$languageCode = explode('-', $imageIdAndLanguageCode)[1];
Pendekatan ini memiliki keuntungan sebagai berikut:
- Tidak perlu menangkap pengecualian
- Pabrik dan Pembibitan dapat dipisahkan agar mudah dibaca
- Kodenya ringkas
Kerugiannya di sini adalah Anda hanya dapat menghasilkan kombinasi tombol di mana salah satu kunci dapat diekspresikan sebagai regex. Selama itu mungkin, ini sepertinya pendekatan yang baik untuk memecahkan masalah ini.