2013-09-24 11 views
6

मेरे database.php में, मेरे पास दो डेटाबेस कॉन्फ़िगर किए गए हैं।लार्वेल - वैश्विक डेटाबेस कनेक्शन को वैश्विक स्तर पर बदलें

'db1' => array(
    'driver' => 'pgsql', 
    'host'  => 'localhost', 
    'database' => 'db1', 
    'username' => 'root', 
    'password' => 'password', 
    'charset' => 'utf8', 
    'prefix' => '', 
    'schema' => 'public', 
), 

'db2' => array(
    'driver' => 'pgsql', 
    'host'  => 'localhost', 
    'database' => 'db2', 
    'username' => 'root', 
    'password' => 'password', 
    'charset' => 'utf8', 
    'prefix' => '', 
    'schema' => 'public', 
), 

तो डिफ़ॉल्ट db1 द्वारा शुरू में डिफ़ॉल्ट डीबी के रूप में स्थापित किया जाएगा। अब मैं 'चयन' ड्रॉपडाउन से एक विकल्प चुनकर डिफ़ॉल्ट डेटाबेस को 'db2' पर स्विच करना चाहता हूं। इस नियंत्रक विधि जिसमें मैं

public function postChangeDb() { 
    $db = Input::get('db'); 
    Config::set('database.default', $db); 
} 

इसके पूर्ण होते ही, मैं ताज़ा 'पृष्ठ करने के लिए एक के बाद AJAX अनुरोध करना होगा, लेकिन कनेक्शन' DB1 'पर अब भी है।

मैं भी निम्नलिखित

public function getTest() { 
    Config::set('database.default', 'db1'); 
    $users = User::all(); 
    echo sizeof($users); // returns 20 

    Config::set(database.default', 'db2'); 
    $users = User::all(); 
    echo sizeof($users); // returns 50 - which is correct! 
    } 

की कोशिश की और इसके बाद के संस्करण ठीक काम करता है और इसे सफलतापूर्वक डेटाबेस स्विच करता है। स्विच 'प्रति अनुरोध' आधार है?

उत्तर

2

क्या आपने app/config/database.php में डिफ़ॉल्ट कनेक्शन को बदलने की कोशिश की है?

'default' => 'db2' 

यदि ऐसा नहीं है तो कृपया समस्या पर अधिक जानकारी प्रदान करें।

संपादित करें: तो ऐसा लगता है कि आपके पास मॉडल में सभी कनेक्शन हार्डकोड हैं। इस तरह के मॉडल को अद्यतन करने का प्रयास करें:

protected $connection = 'db2'; 
+0

हां

नीचे क्या कोड दिखाई देती हैं इसका एक उदाहरण है । कोशिश की। मेरा प्रश्न भी संपादित किया। – ericbae

+0

@ericbae मैंने अपना उत्तर –

4

Config::set केवल एक प्रति अनुरोध के आधार पर काम करने के लिए जा रहा है, तो आप शायद सत्र में अपने डेटाबेस की स्थापना की और बाद में अनुरोध पर यह हड़पने के लिए चाहते करने जा रहे हैं।

आपके पास ऐसा करने के लिए कुछ विकल्प हैं। /app/start/global एक विकल्प होगा। नियंत्रक कन्स्ट्रक्टर में एक और होगा। आप इसे करने के लिए एक सेवा प्रदाता पंजीकृत भी कर सकते हैं। [: अपरीक्षित कोड! चेतावनी] नियंत्रक निर्माता में:

public function __construct() { 
    if(Session::has('selected_database'){ 
     Config::set('database.default',Session::get('selected_database')); 
    } else { 
     return Redirect::to('database_choosing_page'); 
    } 
    } 

और अपने डेटाबेस की स्थापना समारोह के लिए एक अद्यतन:

public function postChangeDb() { 
    $db = Input::get('db'); 
    Session::put('selected_database',$db); 
    Config::set('database.default', $db); 
} 
+0

अपडेट किया है मुझे लगता है कि डेटाबेस प्रत्येक उपयोगकर्ता के लिए सेट है। यदि नहीं, तो सत्र जाने का रास्ता नहीं है। –

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