✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Jak korzystać z funkcji Laravel wielu połączeń z bazą danych na stronie internetowej?

232

Czy chcesz połączyć wiele baz danych z aplikacją Laravel? Czasami możesz natknąć się na sytuację, w której musisz mieć do czynienia z więcej niż jedną bazą danych. W tym artykule dowiemy się, jak łączyć i korzystać z wielu baz danych w aplikacji Laravel. Laravel zapewnia obsługę wielu połączeń z bazą danych w swoim rdzeniu.

Zazwyczaj potrzebujemy jednej bazy danych dla jednej witryny. Ale może się zdarzyć, że będziesz musiał przechowywać niektóre dane o swojej aplikacji w innej bazie danych. Pracowałem nad projektem e-commerce, w którym chcieliśmy przesłać szczegóły zamówienia do osobnej bazy danych. W Twoim przypadku wymagania mogą być inne.

Powiedziawszy to, spójrzmy na łączenie i używanie wielu baz danych z Laravel.

Dodaj wiele połączeń z bazą danych w Laravel

Jak powiedziałem, Laravel umożliwia łączenie wielu baz danych. Możemy użyć innej platformy bazodanowej, takiej jak SQLite, MySQL, SQLSRV z Laravel. W tym samouczku użyję innej instancji MySQL oddzielnej bazy danych. Innymi słowy, zajmiemy się oddzielną bazą danych MySQL jako dodatkową pamięcią masową.

Laravel przechowuje w config/database.phppliku połączenie z bazą danych. Aby dodać kolejne połączenie MySQL, musimy zmodyfikować ten plik.

Dodajmy jeszcze jedno połączenie a mianowicie ‘mysql2’. Możesz nadać temu połączeniu dowolną inną nazwę. Tylko upewnij się, że będziesz używać tej samej nazwy podczas interakcji z bazą danych.

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'),
            ]): [],
        ],
    ]

W powyższym kodzie połączenie ‘mysql’ jest połączeniem domyślnym. Dodałem nowe połączenie ‘mysql2’ z różnymi stałymi. Tutaj przekazałem stałe jako DB_DATABASE_2, DB_USERNAME_2, DB_PASSWORD_2, itd. Jeśli twoja baza danych jest hostowana na innym serwerze, powinieneś również zmienić klucze DB_HOST_2 i DB_PORT_2. Zakładam, że obie bazy danych znajdują się na tym samym serwerze. Nie zmieniam więc wartości tych stałych.

Laravel pobiera wartości tych stałych za pomocą env()metody. Oznacza to, że powinniśmy dodać inne szczegóły bazy danych w pliku ‘.env’ jak poniżej.

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

Po wykonaniu powyższych kroków kończymy podłączanie kolejnej bazy danych w Laravelu. Następna rzecz to interakcja z tą bazą danych.

Uruchom migrację w innej bazie danych w Laravel

Jeśli chodzi o Laravela, zawsze powinniśmy tworzyć tabele w bazie danych za pomocą Migracji. Załóżmy, że chcemy utworzyć tabelę „produkty" w naszej oddzielnej bazie danych. Uruchom poniższe polecenie, które utworzy plik migracji.

php artisan make:migration create_products_table

Utworzy nowy plik w katalogu ‘database/migrations’. Otwórz plik do edytora i przekaż nowo utworzone połączenie, jak pokazano poniżej.

<?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');
    }
}

Przekazałem wartość ‘mysql2’ do connectionmetody Schemaklasy. Oznacza to, że po uruchomieniu polecenia migrate ten kod wykonuje powyższy kod na innej bazie danych, której ciąg połączenia został przez nas przekazany.

php artisan migrate

Po uruchomieniu powyższego polecenia przejdź do drugiej bazy danych. Powinien teraz mieć tabelę „produktów”.

Uruchom zapytania w innej bazie danych

W Laravel możesz wchodzić w interakcję z bazą danych za pomocą Konstruktora zapytań lub używając Eloquent ORM.

DBFasada udostępnia metodę zwaną połączeniem, która służy do uruchamiania zapytań w innej bazie danych. Napiszmy zapytanie w połączeniu ‘mysql2’ za pomocą Konstruktora zapytań.

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

Konstruktor zapytań automatycznie wykona powyższe zapytania w innej bazie danych, odwołując się do metody połączenia.

Jeśli chodzi o Eloquent, istnieją 2 sposoby łączenia oddzielnych baz danych. Pierwszym sposobem jest użycie $connectionzmiennej wewnątrz klasy Model.

<?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
}

Teraz model „Produkty” zajmie się tylko drugą bazą danych.

W drugiej opcji możesz zbudować połączenie w locie, kiedy tylko zajdzie taka potrzeba. W ten sposób możesz wchodzić w interakcje z wieloma bazami danych z jednego modelu.

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

Tutaj ustawiłem czas wykonania połączenia za pomocą setConnection()metody.

Otóż ​​to! Mam nadzieję, że rozumiesz, jak połączyć wiele baz danych w aplikacji Laravel. Podziel się swoimi przemyśleniami i sugestiami w sekcji komentarzy poniżej.

Powiązane artykuły

Źródło nagrywania: artisansweb.net

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów