Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Laravel:Menyemai beberapa kolom unik dengan Faker

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat terhubung ke MySQL di Mac -- file mysql.sock hilang

  2. Menggunakan .aggregate() pada nilai yang diperkenalkan menggunakan .extra(select={...}) dalam Django Query?

  3. Pesan kesalahan:Pengecualian di utas utama org.hibernate.HibernateException:Kesalahan saat mengakses aliran stax

  4. Bagaimana saya bisa menggunakan $_get dengan fungsi build_categories_options?

  5. Bagaimana sprintf() melindungi dari injeksi SQL?