Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

संबंधित है कई डेटाबेस में Laravel में कई संबंध

बहुत ही सरल:

public function bs()
{
    $database = $this->getConnection()->getDatabaseName();
    return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id');
}

मैं डेटाबेस नाम गतिशील रूप से प्राप्त कर रहा हूं क्योंकि मेरा कनेक्शन पर्यावरण चर के आधार पर कॉन्फ़िगर किया गया है। ऐसा लगता है कि लारवेल पिवट टेबल को लक्ष्य संबंध के समान डेटाबेस में मौजूद होने के लिए मानता है, इसलिए यह उस मॉडल के अनुरूप डेटाबेस को देखने के लिए मजबूर करेगा, जिसमें यह विधि आपके 'ए' क्षेत्र में है।

यदि आप SQLite डेटाबेस के बारे में चिंतित नहीं हैं, यानी यूनिट-टेस्ट के दायरे में, तो आपको बस इतना ही चाहिए। लेकिन अगर आप हैं, तो पढ़ते रहें।

सबसे पहले, पिछला उदाहरण अपने आप में पर्याप्त नहीं है। $डेटाबेस का मान फ़ाइल-पथ के रूप में समाप्त हो जाएगा, इसलिए आपको इसे किसी ऐसी चीज़ के लिए उपनाम देना होगा जो SQL कथन को नहीं तोड़ेगा, और इसे वर्तमान कनेक्शन के लिए सुलभ बना देगा। "ATTACH DATABASE '$database' AS $name" आप यह कैसे करते हैं:

public function bs()
{
    $database = $this->getConnection()->getDatabaseName();
    if (is_file($database)) {
        $connection = app('B')->getConnection()->getName();
        $name = $this->getConnection()->getName();
        \Illuminate\Support\Facades\DB::connection($connection)->statement("ATTACH DATABASE '$database' AS $name");
        $database = $name;
    }
    return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id');
}

चेतावनी:लेन-देन इसे उलझाते हैं: यदि वर्तमान कनेक्शन लेन-देन का उपयोग कर रहा है, तो ATTACH DATABASE कथन विफल हो जाएगा। आप कर सकते हैं उस पर लेन-देन का उपयोग करें बाद हालांकि उस कथन को क्रियान्वित करना।

जबकि, यदि संबंधित कनेक्शन लेनदेन का उपयोग करता है, परिणामी डेटा चुपचाप वर्तमान के लिए अदृश्य हो जाएगा। इसने मुझे जितना मैं स्वीकार करना चाहता था, उससे अधिक समय तक मुझे पागल कर दिया, क्योंकि मेरे प्रश्न बिना त्रुटि के चले, लेकिन खाली आते रहे। ऐसा लगता है कि संलग्न डेटाबेस के लिए केवल सही मायने में लिखा गया डेटा ही वास्तव में उस तक पहुंच योग्य है जिससे यह जुड़ा हुआ है।

इसलिए, अपने संलग्न डेटाबेस पर लिखने के लिए मजबूर होने के बाद, आप अभी भी अपने परीक्षण को अपने आप साफ करना चाहते हैं। एक सरल उपाय यह होगा कि आप केवल $this->artisan('migrate:rollback', ['--database' => $attachedConnectionName]); का उपयोग करें। . लेकिन अगर आपके पास एक से अधिक परीक्षण हैं जिन्हें समान तालिकाओं की आवश्यकता है, तो यह बहुत कुशल नहीं है, क्योंकि यह उन्हें हर बार उन्हें फिर से बनाने के लिए मजबूर करता है।

तालिकाओं को छोटा करना एक बेहतर विकल्प होगा, लेकिन उनकी संरचना को व्यवहार में छोड़ दें:

//Get all tables within the attached database
collect(DB::connection($database)->select("SELECT name FROM sqlite_master WHERE type = 'table'"))->each(function ($table) use ($name) {
        //Clear all entries for the table
        DB::connection($database)->delete("DELETE FROM '$table->name'");
        //Reset any auto-incremented index value
        DB::connection($database)->delete("DELETE FROM sqlite_sequence WHERE name = '$table->name'");
    });
}

यह उस कनेक्शन से सभी डेटा मिटा देगा , लेकिन ऐसा कोई कारण नहीं है कि आप उस पर किसी प्रकार का फ़िल्टर लागू नहीं कर सके, हालांकि आप फिट दिखते हैं। वैकल्पिक रूप से, आप इस तथ्य का लाभ उठा सकते हैं कि SQLite डीबी आसानी से सुलभ फाइलें हैं, और केवल संलग्न एक को एक अस्थायी फ़ाइल में कॉपी करें, और परीक्षण निष्पादित होने के बाद स्रोत को ओवरराइट करने के लिए इसका उपयोग करें। परिणाम कार्यात्मक रूप से एक लेन-देन के समान होगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Moodle के लिए MySQL की निगरानी के लिए युक्तियाँ

  2. MySQL:दशमलव डेटा प्रकार का आकार

  3. कॉन्फ़िगरेशन और लाइब्रेरी फ़ाइलों के साथ MySQL को पूरी तरह से कैसे हटाएं?

  4. MySQL डुअल मास्टर

  5. mysql सशर्त सम्मिलित करें - यदि मौजूद नहीं है सम्मिलित करें