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.
-
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ě.
-
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.
- 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.
- Přejděte na svůj název_aplikace/app/Http/Kernel.php
-
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.
-
Nakonec jej nastavte.
- 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');
}
- Přejděte na svůj
A tohle by vám mělo stačit.
Máte-li další otázky, neváhejte je komentovat.
// Zdroje:
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.