sql >> Databáze >  >> RDS >> Mysql

Jak se připojím k různým databázím za běhu?

Narazil jsem na tuto otázku a měl mou odpověď.

Vytvořil jsem třídu s názvem DatabaseConnection :

class DatabaseConnection extends Model
{

        static $instances=array();

        protected $database;

        protected $connection;

        public function __construct($options = null)
        {
            // Set the database
            $database = $options['database'];
            $this->database = $database;

            // Figure out the driver and get the default configuration for the driver
            $driver  = isset($options['driver']) ? $options['driver'] : Config::get("database.default");
            $default = Config::get("database.connections.$driver");

            // Loop through our default array and update options if we have non-defaults
            foreach($default as $item => $value)
            {
                $default[$item] = isset($options[$item]) ? $options[$item] : $default[$item];
            }

            $capsule = new Capsule;
            $capsule->addConnection($default);
            $capsule->setEventDispatcher(new Dispatcher(new Container));
            $capsule->setAsGlobal();
            $capsule->bootEloquent();

            // Create the connection
            $this->connection = $capsule->getConnection();

            DatabaseConnection::$instances[] = $capsule;
            return $this->connection;
        }
}

Takže kdykoli jsem v kontroléru, který manipuluje s tabulkami dílčí databáze, jdu jednoduše tímto způsobem:

public function RandomActionInMyController()
{
      $db_connection = new DatabaseConnection(['database' => 'name_of_db']);
       $someModel = new Model/Model::find()..// Basically anything
        return myreturnstuff;
}

Bonus navíc :

Použití statického atributu $instances v mém DatabaseConnection se scvrkává na načtení mého nejnovějšího databázového připojení pro snadné použití.

Například, kdybych to někdy chtěl načíst, bylo by to zabaleno do funkce, jako je

function CurrentOrLatestDbConnection()
{
    if( !empty(DatabaseConnection::$instances) )
    {
        return end(DatabaseConnection::$instances)->getConnection()->getDatabaseName();
    }
}

Poznámky :

Pokud narazíte na chyby, jako je Unknown class 'Container' nebo Capsule nebo cokoliv podobného, ​​zkontrolujte odkaz na otázku, který jsem uvedl, a použijte use prohlášení správně.

O nadcházejících odpovědích :

Zdá se mi, že toto připojení k databázi žije v závorkách akce ovladače, takže když přistoupím k další akci, která neurčuje žádné připojení, automaticky se vrátí do centrální databáze.

Což mě přivedlo na myšlenku, že musí existovat způsob, jak nastavit připojení databáze k dílčí databázi „globálně“ k celé funkci, jako je middleware nebo tak něco.

Rád bych viděl odpověď, implementující takovou věc.

Aktualizovat :

Přišel jsem na úhlednější způsob, jak to udělat.

Předpokládám, že jste na stejné půdě jako já, chcete podmínečně měnit databáze v souladu s každým kontrolérem... řekněme, že každý z vašich kontrolérů vyžaduje jinou databázi, jen pro argument.

K vyřešení tohoto problému použijeme `Middlewares.

Nejprve vysvětlit, co se chystáme udělat..

Zkontrolujeme název ovladače (a dokonce i akci) a poté nastavíme správnou databázi, kterou chceme nastavit.

  1. Přejděte na příkazový řádek a zadejte:

    php artisan make:middleware SetDatabaseConnectionMiddleware

Chcete-li vytvořit middleware s připraveným standardem.

Nebo, pokud se vám to líbí tvrději, přejděte do své app_name/app/Http/Middleware a vytvořte si ji ručně.

  1. Přejděte do souboru pomocných metod (pokud už nějaký máte, pokud ne, vole, udělejte si ho!)

     function getControllerAndActionName()
    {
    
    $action = app('request')->route()->getAction();
    
    $controller = class_basename($action['controller']);
    
    list($controller, $action) = explode('@', $controller);
    
    return ['action' => $action, 'controller' => $controller];
    }
    

Tím se vám vrátí pole s názvem akce i názvem ovladače, pokud chcete omezeně vrátit pouze název ovladače, můžete odstranit 'action' => $action z kódu.

  1. Uvnitř vašeho middlewaru to bude vypadat takto:

jmenný prostor
    namespace App\Http\Middleware;

    use Closure;
    use DatabaseConnection;

    class SetProperDatabase
    {
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle($request, Closure $next)
    {
         $database_name = '';
         $controllerAndActionName = getControllerAndActionName();
         $controller_name = $controllerAndActionName['controller'];
         $action_name = $controllerAndActionName['action'];
         if($controller_name == 'my_controller_nameController')
         {

         $database_name = 'your_proper_database_name';
         }
         else
         {
          $database_name = 'other_db';
         }

         $database_connection = new DatabaseConnection(['database' => $database_name']);

          return $next($request);
    }
    }

4. Nyní, když jste správně vytvořili svůj middleware, dejte nám vědět, kde aplikaci najdete a pod jakým názvem.

  1. Přejděte na svůj název_aplikace/app/Http/Kernel.php
  2. Ve vašem $routeMiddleware proměnná, přidejte tento řádek

    'set_proper_database' => \App\Http\Middleware\SetProperDatabase::class,

Tímto způsobem víme, jak to nazvat.

  1. Nakonec jej nastavte.

    1. Přejděte na svůj Controller.php (třída Abstract, ze které dědí všechny vaše ovladače)

    public function __construct() { $this->middleware('set_proper_database'); }

A tohle by vám mělo stačit.

Máte-li další otázky, neváhejte je komentovat.

// Zdroje:

1.Název ovladače a akce

2.Dokumentace k middlewaru

3.Další dokumentace middlewaru Poznámky :Ocenil bych nějaké vydání týkající se mého stylingu a odsazení kódu, protože se zdá, že jsem se zde snažil správně nastylovat svůj kód, ale marně, odrážky, které jsem použil, neměly žádný účinek.




  1. Vytvořte databázi MySQL pomocí souboru .SQL

  2. Počítání počtu řádků v tabulce

  3. Použití spouštěčů MySQL

  4. Emulujte klauzuli MySQL LIMIT v Microsoft SQL Server 2000