मैंने इसे सुलझा लिया
मैंने इस समस्या के समाधान के लिए बहुत खोज की और पाया कि कई अन्य लोगों ने भी इसका अनुभव किया है। अगर आपको अपने रिश्ते के दूसरे छोर पर केवल एक तत्व की आवश्यकता है, यह बहुत सीधा हैए> ।
"मल्टी कॉलम अद्वितीय प्रतिबंध" के अतिरिक्त ने इसे जटिल बना दिया है। मुझे मिला एकमात्र समाधान था "MySQL प्रतिबंध को भूल जाओ और पीडीओ-अपवादों के लिए कोशिश-पकड़ के साथ कारखाने के निर्माण को घेर लें"। यह एक खराब समाधान की तरह लगा क्योंकि अन्य पीडीओएक्सप्शन भी पकड़े जाएंगे, और यह सिर्फ "सही" नहीं लगा।
समाधान
इस कार्य को करने के लिए मैंने बीजकों को ImageTableSeeder और ImageTextTableSeeder में विभाजित किया, और वे दोनों बहुत सीधे आगे हैं। उनके रन कमांड दोनों इस तरह दिखते हैं:
public function run()
{
factory(App\Models\ImageText::class, 100)->create();
}
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,
];
});
यह बात है:
$imageIdAndLanguageCode = $faker->unique()->regexify("/^$imageId-[a-z]{2}");
हम एक रेगेक्सिफाइ-एक्सप्रेशन में imageId का उपयोग करते हैं और जो कुछ भी हमारे अद्वितीय संयोजन में शामिल है, इस मामले में '-' वर्ण के साथ अलग किया गया है। यह "841-en", "58-bz", "96-xx" आदि जैसे परिणाम उत्पन्न करेगा जहां imageId हमेशा हमारे डेटाबेस में एक वास्तविक छवि है, या शून्य है।
चूंकि हम इमेज आईडी के साथ भाषा कोड में अद्वितीय टैग चिपकाते हैं, इसलिए हम जानते हैं कि image_id और भाषा कोड का संयोजन अद्वितीय होगा . ठीक यही हमें चाहिए!
अब हम केवल बनाए गए भाषा कोड को निकाल सकते हैं, या जो भी अन्य अद्वितीय क्षेत्र हम उत्पन्न करना चाहते हैं, उसके साथ:
$languageCode = explode('-', $imageIdAndLanguageCode)[1];
इस दृष्टिकोण के निम्नलिखित फायदे हैं:
- अपवादों को पकड़ने की आवश्यकता नहीं है
- कारखानों और सीडर्स को पठनीयता के लिए अलग किया जा सकता है
- कोड संक्षिप्त है
यहां नुकसान यह है कि आप केवल कुंजी संयोजन उत्पन्न कर सकते हैं जहां चाबियों में से एक को रेगेक्स के रूप में व्यक्त किया जा सकता है। जब तक यह संभव है, यह इस समस्या को हल करने का एक अच्छा तरीका प्रतीत होता है।