WEB и WordPress новости, темы, плагины. Здесь мы делимся советами и лучшими решениями для сайтов.

Как использовать функцию множественных подключений к базе данных Laravel на веб-сайте

873

Вы хотите подключить несколько баз данных к своему приложению Laravel? Иногда вы можете столкнуться с ситуацией, когда вам нужно иметь дело с более чем одной базой данных. В этой статье мы изучаем, как подключать и использовать несколько баз данных в приложении Laravel. Laravel обеспечивает поддержку нескольких подключений к базе данных в самом своем ядре.

Обычно нам нужна единая база данных для одного сайта. Но возможно, что вам придется хранить некоторые данные о вашем приложении в другой базе данных. Я работал над проектом электронной коммерции, где мы хотели отправлять детали заказа в отдельную базу данных. В вашем случае требования могут быть разными.

Сказав это, давайте посмотрим на подключение и использование нескольких баз данных с Laravel.

Добавить несколько подключений к базе данных в Laravel

Как я уже сказал, Laravel позволяет подключать несколько баз данных. Мы можем использовать другую платформу базы данных, такую ​​как SQLite, MySQL, SQLSRV с Laravel. В этом руководстве я собираюсь использовать другой экземпляр MySQL отдельной базы данных. Другими словами, мы собираемся иметь дело с отдельной базой данных MySQL в качестве дополнительного хранилища.

Laravel хранит соединение с базой данных в config/database.phpфайле. Чтобы добавить еще одно соединение MySQL, мы должны изменить этот файл.

Давайте добавим еще одно соединение, а именно mysql2. Вы можете дать этому соединению любое другое имя. Просто убедитесь, что вы будете использовать то же имя при взаимодействии с базой данных.

config / database.php

<?php
 
use IlluminateSupportStr;
 
return [
    ...
 
    'connections' => [
        ...
        ...
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            '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', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql')? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]): [],
        ],
 
        'mysql2' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST_2', '127.0.0.1'),
            'port' => env('DB_PORT_2', '3306'),
            'database' => env('DB_DATABASE_2', 'forge'),
            'username' => env('DB_USERNAME_2', 'forge'),
            'password' => env('DB_PASSWORD_2', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql')? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]): [],
        ],
    ]

В приведенном выше коде соединение mysql используется по умолчанию. Я добавил новое соединение mysql2 с разными константами. Здесь я передал константы как DB_DATABASE_2, DB_USERNAME_2, DB_PASSWORD_2 и т.д. Если ваша база данных размещена на другом сервере, вам также следует изменить ключи DB_HOST_2 и DB_PORT_2. Я предполагаю, что обе базы данных находятся на одном сервере. Итак, я не меняю значения этих констант.

Laravel получает значения этих констант с помощью env()метода. Это означает, что мы должны добавить другие детали базы данных в файл .env, как показано ниже.

DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=
DB_USERNAME_2=
DB_PASSWORD_2=

После выполнения вышеуказанных шагов мы закончили с подключением другой базы данных в Laravel. Следующая вещь взаимодействует с этой базой данных.

Запустите миграцию в другой базе данных в Laravel

Когда дело доходит до Laravel, мы всегда должны создавать таблицы в базе данных с помощью Migrations. Допустим, мы хотим создать таблицу «продукты» в нашей отдельной базе данных. Выполните приведенную ниже команду, которая создаст файл миграции.

php artisan make:migration create_products_table

Он создаст новый файл в каталоге database / migrations. Откройте файл в редакторе и передайте вновь созданное соединение, как показано ниже.

<?php
 
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
 
class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::connection('mysql2')->create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }
 
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::connection('mysql2')->dropIfExists('products');
    }
}

Я передал значение mysql2 connectionметоду Schemaкласса. Это означает, что когда вы запускаете команду migrate, этот код выполняет вышеуказанный код в другой базе данных, строку подключения которой мы передали.

php artisan migrate

После выполнения указанной выше команды перейдите ко второй базе данных. Теперь у него должна быть таблица продуктов.

Запускать запросы в другой базе данных

В Laravel вы можете взаимодействовать с базой данных либо через построитель запросов, либо с помощью Eloquent ORM.

DBФасад предоставляет метод под названием connection, который используется для выполнения запросов в другой базе данных. Напишем запрос на соединение mysql2 с помощью Query Builder.

$products = DB::connection('mysql2')->select('SELECT * FROM products');
$products = DB::connection('mysql2')->select('SELECT * FROM products where id = ?', [1]);

Конструктор запросов автоматически выполнит указанные выше запросы в другой базе данных, взяв ссылку на метод подключения.

Когда дело доходит до Eloquent, есть 2 способа подключения отдельных баз данных. Первый способ – использовать $connectionпеременную внутри вашего класса модели.

<?php
 
namespace AppModels;
 
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
 
class Product extends Model
{
    use HasFactory;
 
    /**
     * The connection name for the model.
     *
     * @var string
     */
    protected $connection = 'mysql2'; //pass the connection name here
}

Теперь модель «Продукты» будет иметь дело только со второй базой данных.

Во втором варианте вы можете установить соединение на лету, когда это необходимо. Таким образом, вы можете взаимодействовать с несколькими базами данных из одной модели.

<?php
...
use AppModelsProduct;
 
class ProductController extends Controller
{
    public function index()
    {
        $product = new Product;
        $product->setConnection('mysql2');
        $arr_product = $product->find(1);
        dd($arr_product);
    }
}

Здесь я установил время выполнения соединения с помощью setConnection()метода.

Это оно! Надеюсь, вы понимаете, как подключить несколько баз данных в приложении Laravel. Пожалуйста, поделитесь своими мыслями и предложениями в разделе комментариев ниже.

Статьи по Теме

Источник записи: artisansweb.net

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее