লারাভেলে একাধিক ডাটাবেস কীভাবে ব্যবহার করবেন


224

আমি আমার সিস্টেমে একাধিক ডাটাবেস একত্রিত করতে চাই। বেশিরভাগ সময় ডাটাবেসটি মাইএসকিউএল হয়; তবে এটি ভবিষ্যতে পৃথক হতে পারে অর্থাৎ অ্যাডমিন এমন প্রতিবেদন তৈরি করতে পারে যা ভিন্ন ভিন্ন ডাটাবেজ সিস্টেমের উত্স is

সুতরাং আমার প্রশ্ন হ'ল লারাভেল কি এই জাতীয় পরিস্থিতি মোকাবেলার জন্য কোনও ফেকাদ সরবরাহ করে? বা অন্য কোনও কাঠামোর সমস্যার জন্য আরও উপযুক্ত দক্ষতা রয়েছে?

উত্তর:


469

ব্যবহার করে .env> = 5.0 (5.5 এ পরীক্ষিত)

ভিতরে .env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=secret

DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=secret

ভিতরে config/database.php

'mysql' => [
    'driver'    => env('DB_CONNECTION'),
    'host'      => env('DB_HOST'),
    'port'      => env('DB_PORT'),
    'database'  => env('DB_DATABASE'),
    'username'  => env('DB_USERNAME'),
    'password'  => env('DB_PASSWORD'),
],

'mysql2' => [
    'driver'    => env('DB_CONNECTION_SECOND'),
    'host'      => env('DB_HOST_SECOND'),
    'port'      => env('DB_PORT_SECOND'),
    'database'  => env('DB_DATABASE_SECOND'),
    'username'  => env('DB_USERNAME_SECOND'),
    'password'  => env('DB_PASSWORD_SECOND'),
],

নোট: ইন mysql2করে DB_username এবং DB_password একই হয়, তাহলে আপনি ব্যবহার করতে পারেন env('DB_USERNAME')যা metioned হয় .envপ্রথম কয়েক লাইন।

.env<5.0 ছাড়াই

সংযোগগুলি সংজ্ঞায়িত করুন

app/config/database.php

return array(

    'default' => 'mysql',

    'connections' => array(

        # Primary/Default database connection
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '127.0.0.1',
            'database'  => 'database1',
            'username'  => 'root',
            'password'  => 'secret'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        # Secondary database connection
        'mysql2' => array(
            'driver'    => 'mysql',
            'host'      => '127.0.0.1',
            'database'  => 'database2',
            'username'  => 'root',
            'password'  => 'secret'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

স্কিমা

কোন সংযোগটি ব্যবহার করবেন তা নির্দিষ্ট করতে, কেবল connection()পদ্ধতিটি চালান

Schema::connection('mysql2')->create('some_table', function($table)
{
    $table->increments('id'):
});

অনুসন্ধান নির্মাতা

$users = DB::connection('mysql2')->select(...);

বাকপটু

$connectionআপনার মডেলটিতে ভেরিয়েবল সেট করুন

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

আপনি রানটাইম সময়ে setConnectionপদ্ধতি বা onস্থির পদ্ধতির মাধ্যমে সংযোগটি সংজ্ঞায়িত করতে পারেন :

class SomeController extends BaseController {

    public function someMethod()
    {
        $someModel = new SomeModel;

        $someModel->setConnection('mysql2'); // non-static method

        $something = $someModel->find(1);

        $something = SomeModel::on('mysql2')->find(1); // static method

        return $something;
    }

}

দ্রষ্টব্য ডাটাবেস জুড়ে টেবিলের সাথে সম্পর্ক তৈরির চেষ্টা সম্পর্কে সতর্ক হন! এটি করা সম্ভব, তবে এটি কিছু সাবধানতা সহ আসতে পারে এবং আপনার কী ডেটাবেস এবং / অথবা ডাটাবেস সেটিংসের উপর নির্ভর করে।


লারাভেল ডক্স থেকে

একাধিক ডাটাবেস সংযোগ ব্যবহার করে

একাধিক সংযোগ ব্যবহার করার সময়, আপনি সম্মুখ connectionদিকে সংযোগ পদ্ধতির মাধ্যমে প্রতিটি অ্যাক্সেস করতে পারেন DBnameপ্রেরণ connectionপদ্ধতি আপনার তালিকাভুক্ত সংযোগ এক মিলা উচিত config/database.phpকনফিগারেশন ফাইল:

$users = DB::connection('foo')->select(...);

আপনি সংযোগ উদাহরণে getPdo পদ্ধতি ব্যবহার করে কাঁচা, অন্তর্নিহিত PDO উদাহরণ অ্যাক্সেস করতে পারেন:

$pdo = DB::connection()->getPdo();

উপকারী সংজুক

  1. লারাভেল 5 একাধিক ডাটাবেস সংযোগ FROM laracasts.com
  2. লারাভেল এফআরএম-এ একাধিক ডাটাবেস সংযুক্ত করুন tutsnare.com
  3. লারাভেল এফআরএম এ একাধিক ডিবি সংযোগ fideloper.com

1
আপনি ব্যবহার করতে পারেন class SomeModel extends Model { এবং নিশ্চিত করুন যে আপনি যেমন env ফাইল থেকে সরানো মান নিশ্চিত করতে env('DB_DATABASE', 'name')যখন আপনি database.php ফাইলটি নতুন ডিবি কনফিগারেশন অ্যারে তৈরি হিসাবে @sba উল্লেখ করেছেন
Sadee

1
আরে, আমি লুমেন এবং ডেটাবেস কনফিগার অংশের জন্য ব্যবহার করছি, আমার কাছে কেবল ".env" ফাইল রয়েছে। ডাটাবেস.এফপি নয়। তাহলে আমি কীভাবে এটি ঠিক করতে পারি?
চানাকা দে সিলভা

1
@ চনাকাডেসিলভা আপনি লুমেনের জন্য একটি কনফিগার ফোল্ডার এবং একটি ডাটাবেস.এফপি ফাইল তৈরি করুন। স্পষ্টতই লুমেন সেই ফাইলটি বিদ্যমান কিনা তা নিয়মিত যাচাই করে দেখছে এবং যদি তা থাকে তবে তা ব্যবহার করবে।
Etersters

1
ধন্যবাদ ভাই আমি মনে করি আমি এখন এই কাজটি
নিচ্ছি

1
@ আবদুল্লা নীলাম 1 জন আমার কাছে মাল্টিবডি অ্যাপ তৈরি করতে এসেছিল প্রথম ভাবা হয়েছিল আমি যদি বুঝতে পারি তবে এখন এটির সহজ বিষয়টি আমি জানি কিনা; পি
বিনার

12

লারাভেল 5.1 এ আপনি সংযোগটি নির্দিষ্ট করেছেন:

$users = DB::connection('foo')->select(...);

ডিফল্ট, লারাভেল ডিফল্ট সংযোগ ব্যবহার করে। এটা সহজ, তাই না?

এখানে আরও পড়ুন: http://laravel.com/docs/5.1/database#accessing- সংযোগগুলি


লারাভেল ৫.১-তে স্পষ্টত কী হবে?
সিমো

1
@ সিমো, আবদুল্লার উত্তর দেখুন।
স্কেলিনগারহ্ট

আমি স্যামের জন্য একটি সম্পূর্ণ নিবন্ধ লিখেছি আপনি এটি <a href=" stackcoder.in/posts/… 7..x একাধিক ডাটাবেস সংযোগগুলি, মাইগ্রেশনস, সম্পর্ক ও অনুসন্ধান </ i> এ চেক করতে পারবেন
চন্নবীর হাকারি

6

আসলে, DB::connection('name')->select(..)আমার পক্ষে কাজ করে না, কারণ 'নাম' ডাবল উক্তিতে থাকতে হবে: "নাম"

তবুও, নির্বাচিত ক্যোয়ারী আমার ডিফল্ট সংযোগে কার্যকর করা হয়েছে। এখনও বোঝার চেষ্টা করছেন, কীভাবে লারাভেলকে বোঝানো যায় সেভাবে কাজ করার জন্য: সংযোগটি পরিবর্তন করুন।

সম্পাদনা: আমি এটি বের করেছিলাম। লারাভেলস ডেটাবেস ম্যানেজার ডিবাগ করার পরে এটি আমার ডাটাবেস.ফাইপ (কনফিগারেশন ফাইল) ((এই-> অ্যাপ্লিকেশনটির ভিতরে) ভুল ছিল। "সংযোগগুলি" বিভাগে আমার কাছে এটির অনুলিপি করা মানগুলির সাথে "ডাটাবেস" এর মতো জিনিস ছিল। পরিবর্তে স্পষ্ট ভাষায়

env('DB_DATABASE', 'name')

আমার কিছু দরকার ছিল

'myNewName'

যেহেতু সমস্ত সংযোগগুলি ডাটাবেস, ব্যবহারকারীর নাম, পাসওয়ার্ড ইত্যাদির জন্য একই মানগুলির সাথে তালিকাবদ্ধ ছিল তবে আমি কমপক্ষে অন্য একটি ডাটাবেসের নাম অ্যাক্সেস করতে চাইলে অবশ্যই কোন ধারণা নেই?

অতএব, আমি যখনই অন্য ডাটাবেস থেকে কিছু নির্বাচন করতে চেয়েছি তখনই আমি সর্বদা আমার ডিফল্ট ডাটাবেসে শেষ হয়ে যাই


1
ধন্যবাদ! আপনি আমার বিচক্ষণতা বাঁচিয়েছেন। আমার সমস্ত প্রশ্নের ডিফল্ট ডাটাবেসকে কেন উল্লেখ করা হয়েছে তা আমি চেষ্টা করার চেষ্টা করেছি। তারপরে আমি আপনার পোস্টটি পড়েছি এবং বুঝতে পেরেছি en এনভিও সর্বদা .ইএনভি মানগুলি ফেরত দেয় এবং দ্বিতীয় প্যারামিটারটি কেবল লারভেল ব্যবহার করেনি fall
মোহা

অফ-টপিক: এটি দুর্দান্ত হবে, যদি প্রশাসকরা আমার পোস্টগুলিতে হেরফের না করে। বা কমপক্ষে আমাকে একটি ব্যক্তিগত বার্তা লিখুন তারা কী এবং কেন পরিবর্তন করতে চায়। আমি কীভাবে ব্যক্তিগত বার্তা পাঠাতে পারি তা বুঝতে পারি নি।
এসবা

আমারও একই সমস্যা ছিল, আমি মানটি পরিবর্তন করেছি তবে কীটি নয়। এটি এর মতো কাজ করেছে: 'ডাটাবেস' => এনভ ('ডিবি_নিউ_ডাটাবেস', 'মাইনিউ ডেটাবেস')। ভালভাবে লিপিবদ্ধ!
ফেলিপ সান্চ

0

লারাভেলের একাধিক ডাটাবেস সিস্টেমের জন্য অন্তর্নির্মিত সমর্থন রয়েছে, আপনাকে কনফিগারেশন / ডাটাবেস.এফপি ফাইলটিতে সংযোগের বিশদ সরবরাহ করতে হবে

return [
    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
'mysqlOne' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_ONE', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_ONE', 'forge'),
            'username' => env('DB_USERNAME_ONE', 'forge'),
            'password' => env('DB_PASSWORD_ONE', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
];

একবার আপনার কাছে এলে আপনি প্রতিটি সংযোগের জন্য দুটি বেস মডেল ক্লাস তৈরি করতে পারেন এবং সেই মডেলগুলিতে সংযোগের নামটি সংজ্ঞায়িত করতে পারেন

//BaseModel.php
protected $connection = 'mysql';

//BaseModelOne.php
protected $connection = 'mysqlOne';

প্রতিটি ডিবিতে টেবিলের জন্য আরও মডেল তৈরি করতে আপনি এই মডেলগুলি প্রসারিত করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.