2015-06-25 2 views
6

मुझे रन टाइम में लार्वेल 5 डेटाबेस कनेक्शन बदलने की जरूरत है।लार्वेल चेंज डाटाबेस कनेक्शन रन टाइम

क्या आपको इसके बारे में कोई जानकारी है?

कृपया मेरे साथ साझा करें।

धन्यवाद।

+0

यह लिंक http://fideloper.com/laravel-multiple-database-connections – imsheth

उत्तर

8

ठीक है, मेरा तत्काल उत्तर यह है: नहीं। संभावना है कि आप अपना डेटा मॉडल बदलकर और कुछ और उन्नत रिश्तों के साथ काम करके अपना काम पूरा कर सकते हैं। यह जानना मुश्किल है कि आप क्या करना चाहते हैं, लेकिन यह सामान्य रूप से मुझे एक बुरा विचार पसंद है, विशेष रूप से यदि आप वाक्प्रचार मॉडल का उपयोग करने की योजना बना रहे हैं और

उस परिदृश्य में जहां आपको वास्तव में आवश्यकता है किसी अन्य डेटाबेस में डेटा बदलने या कुछ कच्ची क्वेरी निष्पादित करने के लिए आप DB::connection() विधि का उपयोग कर सकते हैं। की तरह कुछ:

$data = DB::connection('another_connection')->select(...); 

आप अपने database.php फ़ाइल पर कि another_connection चर निर्दिष्ट कर सकते हैं।

<?php 
return array(

'default' => 'mysql', 

'connections' => array(

    # Your regular connection 
    'mysql' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'database', 
     'username' => 'user', 
     'password' => 'password' 
     'charset' => 'utf8', 

    ), 

    # Your new connection 
    'another_connection' => array(
     'driver' => 'mysql', 
     'host'  => 'another_host', 
     'database' => 'another_db', 
     'username' => 'user1', 
     'password' => 'password1' 
     'charset' => 'utf8', 
    ), 
), 
); 

तुम भी प्रत्येक वाक्पटु मॉडल protected $connection = 'another_connection'; का उपयोग कर भी आप एक मॉडल के उदाहरण बनाया/रन टाइम पर पूछे के लिए एक कनेक्शन निर्दिष्ट कर सकते हैं के लिए एक कनेक्शन

$user = new User; 
$user->setConnection('another_connection'); 
$user1 = $user->find(1); 

लेकिन तब फिर से, मैं निर्दिष्ट कर सकते हैं: इस तरह व्यक्तिगत रूप से नहीं लगता कि यह एक अच्छा विचार है और ऐसा लगता है कि सबकुछ गन्दा हो सकता है और बहुत तेज़ी से गिर सकता है क्योंकि आपका आवेदन जटिलता में बढ़ता है।

+1

आपकी उत्तर के लिए धन्यवाद, मैंने मॉडल की विधि में 'कनेक्शन' प्रॉपर्टी को बदलने की कोशिश की, लेकिन' कनेक्शन 'विधि का उपयोग करके डीबी मुखौटा चाल चल रहा था। वैध उपयोग केस का विस्तार करने के लिए: मैं छोटी प्रणाली बना रहा हूं जो जांचता है कि क्या सभी डेटा सही तरीके से मैप किए गए हैं। यह आवश्यकता स्वयं को पेश की गई जब मैं उपयोगकर्ताओं के लिए मुफ्त पाठ प्रवेश अवसरों और खुद को रिपोर्टिंग अंत में अनुभव कर रहा था। सभी एप्लिकेशन डेटा को MySQL डेटाबेस में संग्रहीत किया जाता है, लेकिन मुझे यह सत्यापित करने के लिए SQL सर्वर से पूछताछ करने की आवश्यकता है कि मेरा - MySQL में - सहेजे गए प्रश्न उत्पादन अंत में परेशानी में चलते हैं। – Ben

+0

व्यक्तिगत रूप से, मैं स्विचिंग कनेक्शन के खिलाफ हूं। और मुझे इसे संग्रहीत करने के बाद डेटा को सत्यापित करने का विचार नहीं मिल रहा है, डेटा भंडारण से पहले सत्यापित किया जाना चाहिए। –

+0

धन्यवाद, सिर्फ रिकॉर्ड के लिए, न केवल 'डीबी' बल्कि 'स्कीमा' के पास एक कनेक्शन फ़ंक्शन है, यह ऐसा काम करता है: 'स्कीमा :: कनेक्शन (' pgsql_admin ') -> बनाएं (' –

4

आप

Config::set('database.connections.mysql.database', 'other_database'); 

का उपयोग कर रन टाइम के दौरान कनेक्शन विवरण बदल सकते हैं, लेकिन भूल नहीं है कैश

DB::purge('mysql'); 
+0

मैंने दस घंटे बर्बाद कर दिया रनटाइम पर डिफ़ॉल्ट डेटाबेस बदलें। मैं भूल गया था डीबी :: purge() विधि। धन्यवाद! –

0

हम एक समान परिदृश्य है को नष्ट करने के पहले शुद्ध करने के लिए है, जहां देखने के लिए ऐतिहासिक डेटा, हम डेटाबेस बदलते हैं। हम मॉडल में निम्नलिखित का उपयोग करें:

$inventory = Inventory::inventory('data_2016', 2); 

इस तरह, आप कनेक्शन को परिभाषित करने की जरूरत नहीं है:

public function inventory($db, $id) { 
    return DB::table($db . '.inventory')->where('inventoryid', $id)->get(); 
} 

और उसके बाद, कोड पर, हम $ db एक पैरामीटर के रूप भेज प्रत्येक डेटाबेस के लिए और डेटाबेस कॉन्फ़िगरेशन फ़ाइलों के साथ tinker नहीं है।

केवल नकारात्मक पक्ष यह है कि आप सीधे मॉडल का उपयोग करने में असमर्थ हैं, इसके बजाय आपको डीबी सहायक का उपयोग करना होगा।

संबंधित मुद्दे