Saya menemukan pertanyaan ini dan itu jawaban saya.
Saya membuat kelas bernama 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;
}
}
Jadi, setiap kali saya berada di pengontrol yang memanipulasi tabel sub-basis data, saya hanya melakukan ini:
public function RandomActionInMyController()
{
$db_connection = new DatabaseConnection(['database' => 'name_of_db']);
$someModel = new Model/Model::find()..// Basically anything
return myreturnstuff;
}
Bonus Ekstra :
Penggunaan atribut statis $instances
di DatabaseConnection
saya intinya untuk mengambil koneksi database terbaru saya untuk kemudahan penggunaan.
Misalnya, jika saya ingin mengambilnya, itu akan dibungkus dengan fungsi seperti
function CurrentOrLatestDbConnection()
{
if( !empty(DatabaseConnection::$instances) )
{
return end(DatabaseConnection::$instances)->getConnection()->getDatabaseName();
}
}
Catatan :
Jika Anda menemukan kesalahan seperti Unknown class 'Container'
atau Capsule
atau semacamnya, pastikan Anda memeriksa tautan pertanyaan yang saya berikan, dan gunakan use
pernyataan dengan benar.
Mengenai jawaban yang akan datang :
Tampaknya bagi saya bahwa koneksi basis data ini hidup dalam tanda kurung tindakan pengontrol, jadi ketika saya melanjutkan ke tindakan lain yang tidak menentukan koneksi, ia kembali ke basis data pusat secara otomatis.
Yang membuat saya berpikir bahwa harus ada cara untuk mengatur koneksi database ke sub-database dengan cara 'global' ke seluruh fungsi, seperti middleware atau semacamnya.
Saya ingin melihat jawaban, menerapkan hal seperti itu.
Perbarui :
Saya menemukan cara yang lebih rapi untuk melakukannya.
Saya berasumsi Anda berada di landasan yang sama dengan saya, ingin mengubah database secara kondisional sesuai dengan masing-masing pengontrol... katakanlah, setiap pengontrol Anda memerlukan database yang berbeda, hanya demi argumen.
Apa yang akan kita gunakan untuk menyelesaikan ini adalah `Middlewares.
Pertama, untuk menjelaskan apa yang akan kita lakukan..
Kami akan memeriksa nama pengontrol (dan bahkan tindakan) dan kemudian mengatur database yang tepat yang ingin kami atur.
-
Buka baris perintah Anda, ketik:
php artisan make:middleware SetDatabaseConnectionMiddleware
Untuk membuat middleware dengan boilerplate siap pakai.
Atau, jika Anda suka, buka app_name/app/Http/Middleware dan buat secara manual.
-
Buka file metode pembantu Anda (jika Anda sudah memilikinya, jika belum, buatlah!)
function getControllerAndActionName() { $action = app('request')->route()->getAction(); $controller = class_basename($action['controller']); list($controller, $action) = explode('@', $controller); return ['action' => $action, 'controller' => $controller]; }
Ini akan mengembalikan kepada Anda sebuah array dengan nama aksi dan nama pengontrol, jika Anda ingin mengembalikan secara terbatas hanya nama pengontrol, silakan hapus 'action' => $action
dari kode.
- Di dalam middleware Anda, akan terlihat seperti ini :
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.Sekarang, setelah Anda membuat middleware dengan benar, izinkan kami memberi tahu aplikasi Anda di mana menemukannya dan dengan nama apa.
- Buka app_name/app/Http/Kernel.php Anda
-
Di
$routeMiddleware
. Anda variabel, tambahkan baris ini'set_proper_database' => \App\Http\Middleware\SetProperDatabase::class,
Dengan cara ini kita tahu bagaimana menyebutnya.
-
Terakhir, siapkan.
- Buka
Controller.php
your Anda (kelas Abstrak tempat semua pengontrol Anda mewarisi)
public function __construct()
{
$this->middleware('set_proper_database');
}
- Buka
Dan ini harus melakukannya untuk Anda.
Jika Anda memiliki pertanyaan lebih lanjut, jangan ragu untuk berkomentar.
// Sumber daya :
1.Nama Pengontrol Dan Tindakan
3.Dokumentasi Middleware Lebih Lanjut Catatan :Saya menghargai beberapa edisi tentang gaya dan indentasi kode saya, karena sepertinya saya berjuang untuk menata kode saya dengan benar di sini tetapi sia-sia, lekukan yang saya gunakan tidak berpengaruh.