Is there a way in Laravel to use multiple connections simultaneously in a combined manner?

23 Views Asked by At

My Laravel configuration files and code are as follows:

config/database:

'mysql1' => [
      'driver' => 'mysql',
      'url' => env('DATABASE_URL1'),
      'host' => env('DB_HOST_1', 'Example IP1'),
      'port' => env('DB_PORT_1', 'Example Port1'),
      'database' => env('DB_DATABASE_1', 'forge'),
      'username' => env('DB_USERNAME_1', 'forge'),
      'password' => env('DB_PASSWORD_1', ''),
      'unix_socket' => env('DB_SOCKET_1', ''),
      '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_URL2'),
   'host' => env('DB_HOST_2', 'Example IP2'),
   'port' => env('DB_PORT_2', 'Example Port2'),
   'database' => env('DB_DATABASE_2', 'forge'),
   'username' => env('DB_USERNAME_2', 'forge'),
   'password' => env('DB_PASSWORD_2', ''),
   'unix_socket' => env('DB_SOCKET_2', ''),
   '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'),
   ]) : [],
  ],

env file:

DB_CONNECTION=mysql1
DB_HOST_1=Example IP1
DB_PORT_1=Example Port1
DB_DATABASE_1=AutomobileAppDB
DB_USERNAME_1=ExampleUser1
DB_PASSWORD_1=ExamplePass1
DB_SOCKET_1=path1

DB_CONNECTION2=mysql2
DB_HOST_2=Example IP2
DB_PORT_2=Example Port2
DB_DATABASE_2=AutomobileAppDB
DB_USERNAME_2=ExampleUser2
DB_PASSWORD_2=ExamplePass2
DB_SOCKET_2=path2

Cartable model code:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Cartable extends Model
{
  public static function getCombinedData()
  {
    $servers = DB::connection(env('DB_CONNECTION1'))
      ->table(env('DB_DATABASE_1') . '.db_manager_servers')->get();

    $mainconn = $servers[0]->connection_name;
    $maindbname = $servers[0]->database_name;

    $data = collect();
    foreach ($servers as $server) {
      $conn = $server->connection_name;
      $dbname = $server->database_name;

      $sql = 'SELECT ' .
        $conn . '.' . $dbname . '.documents.docyear,' .
        $conn . '.' . $dbname . '.documents.docno,' .
        $mainconn . '.' . $maindbname . '.doctype.name
        FROM ' .
        $conn . '.' . $dbname . '.documents
        JOIN ' .
        $mainconn . '.' . $maindbname . '.doctype
        ON ' .
        $conn . '.' . $dbname . '.documents.doctype_id
        = ' .
        $mainconn . '.' . $maindbname . '.doctype.id';
      
      $sqlcode = DB::select($sql);
      $data = $data->merge($sqlcode);
    }

    dd($data);
    return $data;
  }
}

I'm getting an error:

Illuminate\Database\QueryException

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.doctypes ON mysql1.Automobi...' at line 6

These test queries work:

   $sql = 'SELECT AutomobileAppDB.documents.docyear,
            AutomobileAppDB.documents.docno,
            From
            AutomobileAppDB.documents
            ';
$data = DB::connection('mysql1')->select($sql );
dd($data );

and:

$sql = 'SELECT AutomobileAppDB.doctypes.name
      From
      AutomobileAppDB.doctypes
      ';
$data = DB::connection('mysql2')->select($sql );
dd($data );

How can I combine data from the two connections using a single query?
I get an error when I enter the connection for each section.

0

There are 0 best solutions below