Tôi tình cờ gặp câu hỏi này và nó đã có câu trả lời của tôi.
Tôi đã tạo một lớp có tên là 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;
}
}
Vì vậy, bất cứ khi nào tôi ở trong bộ điều khiển thao tác các bảng của cơ sở dữ liệu con, tôi chỉ cần thực hiện theo cách này:
public function RandomActionInMyController()
{
$db_connection = new DatabaseConnection(['database' => 'name_of_db']);
$someModel = new Model/Model::find()..// Basically anything
return myreturnstuff;
}
Tiền thưởng thêm :
Việc sử dụng thuộc tính tĩnh $instances
trong DatabaseConnection
của tôi tìm cách truy xuất kết nối cơ sở dữ liệu mới nhất của tôi để sử dụng dễ dàng.
Ví dụ:nếu tôi muốn truy xuất nó, nó sẽ được bao bọc trong một hàm chẳng hạn như
function CurrentOrLatestDbConnection()
{
if( !empty(DatabaseConnection::$instances) )
{
return end(DatabaseConnection::$instances)->getConnection()->getDatabaseName();
}
}
Ghi chú :
Nếu bạn gặp phải các lỗi như Unknown class 'Container'
hoặc Capsule
hoặc bất kỳ thứ gì thuộc loại đó, hãy đảm bảo bạn kiểm tra liên kết câu hỏi mà tôi đã cung cấp và sử dụng use
tuyên bố đúng.
Liên quan đến các câu trả lời sắp tới :
Đối với tôi, dường như kết nối cơ sở dữ liệu này nằm trong dấu ngoặc của hành động của bộ điều khiển, vì vậy khi tôi tiến hành một hành động khác mà chỉ định không có kết nối, nó sẽ tự động quay trở lại cơ sở dữ liệu trung tâm.
Điều đó khiến tôi nghĩ rằng phải có cách để thiết lập kết nối cơ sở dữ liệu với cơ sở dữ liệu con theo cách 'toàn cầu' cho toàn bộ chức năng, chẳng hạn như phần mềm trung gian hoặc thứ gì đó.
Tôi rất thích xem câu trả lời, thực hiện điều đó.
Cập nhật :
Tôi đã nghĩ ra một cách làm gọn gàng hơn.
Tôi giả sử bạn có cùng quan điểm với tôi, muốn thay đổi cơ sở dữ liệu có điều kiện phù hợp với từng bộ điều khiển ... giả sử, mỗi bộ điều khiển của bạn yêu cầu một cơ sở dữ liệu khác nhau, chỉ vì lý do.
Những gì chúng tôi sẽ sử dụng để giải quyết vấn đề này là `Middlewares.
Trước tiên, để giải thích những gì chúng tôi sắp làm ..
Chúng tôi sẽ kiểm tra tên của bộ điều khiển (và thậm chí cả hành động) và sau đó đặt cơ sở dữ liệu thích hợp mà chúng tôi muốn đặt.
-
Chuyển đến dòng lệnh của bạn, nhập:
php artisan make:middleware SetDatabaseConnectionMiddleware
Để tạo một phần mềm trung gian với bảng soạn sẵn.
Hoặc, nếu bạn thích nó theo cách khó, hãy truy cập app_name / app / Http / Middleware của bạn và tạo một cái theo cách thủ công.
-
Truy cập tệp phương thức trợ giúp của bạn (nếu bạn đã có, nếu chưa có, hãy tạo một tệp!)
function getControllerAndActionName() { $action = app('request')->route()->getAction(); $controller = class_basename($action['controller']); list($controller, $action) = explode('@', $controller); return ['action' => $action, 'controller' => $controller]; }
Thao tác này sẽ trả về cho bạn một mảng có cả tên hành động và tên bộ điều khiển, nếu bạn chỉ muốn trả lại một cách hạn chế chỉ tên của bộ điều khiển, vui lòng xóa 'action' => $action
từ mã.
- Bên trong phần mềm trung gian của bạn, nó sẽ trông theo cách này:
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.Bây giờ, bạn đã tạo đúng cách phần mềm trung gian của mình, hãy để chúng tôi cho ứng dụng của bạn biết nơi tìm nó và dưới tên gì.
- Truy cập app_name / app / Http / Kernel.php của bạn
-
Trong
$routeMiddleware
của bạn biến, thêm dòng này'set_proper_database' => \App\Http\Middleware\SetProperDatabase::class,
Theo cách này, chúng tôi biết cách gọi nó.
-
Cuối cùng, thiết lập nó.
- Truy cập
Controller.php
của bạn (lớp Tóm tắt mà từ đó tất cả bộ điều khiển của bạn kế thừa)
public function __construct()
{
$this->middleware('set_proper_database');
}
- Truy cập
Và điều này sẽ làm điều đó cho bạn.
Nếu bạn có bất kỳ câu hỏi nào khác, vui lòng bình luận.
// Tài nguyên:
1. Tên người điều khiển và hành động
2. Tài liệu về phần mềm trung gian
3. Tài liệu bổ sung về phần mềm trung gian Ghi chú : Tôi đánh giá cao một số ấn bản liên quan đến kiểu và thụt lề mã của tôi, vì có vẻ như tôi đã cố gắng tạo kiểu mã đúng cách ở đây nhưng vô ích, các thụt lề mà tôi đã sử dụng không có hiệu quả.