Laravel - 如何将变量传递给构造函数到模型然后使用 eloquent?动态设置数据库连接

Laravel - How to pass variable to constructor to model and then use eloquent? dynamic set database connection

我有一个问题,我正在努力解决我在构建模型实例时尝试动态设置数据库连接的地方。但是,一旦我初始化模型,我就很难使用 eloquent。

在我的模型中,我有以下构造函数:

public function __construct(School $school, array $attributes = [])
{
    parent::__construct($attributes);

    if ($school instanceof School) {

        $host = $school->database;

        Config::set('database.connections.school', [
            'driver'   => 'mysql',
            'host'     => $host->host,
            'port'     => $host->port,
            'database' => $host->database_name,
            'username' => $host->database_username,
            'password' => $host->database_password,
        ]);

        $this->setConnection('school');

    }

}

然后在我的控制器中,我尝试查询如下数据:

$student = new Student($this->selected_school);
$this->student = $student::query()->where('student_reference_code', $this->student_reference_code)->first();

但是我收到以下错误:

Too few arguments to function App\Models\Student::__construct(), 0 passed in /Users/user/Sites/project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 1321 and at least 1 expected

我不确定这是否是设置数据库连接的最佳方式,因为每所学校都有单独的数据库。

任何关于我如何使用 eloquent 通过学校使用正确的数据库连接查询模型的帮助将不胜感激。

--

我还尝试在模型中创建一个方法,例如:

public function getStudentByStudentReferenceCode($reference_code)
{
    return $this->where('student_reference_code', $this->student_reference_code)->first();
}


$this->student = $student->getStudentByStudentReferenceCode($this->student_reference_code);

然而我收到以下信息:

App\Models\Student::__construct(): Argument #1 ($school) must be of type App\Models\School, array given, called in /Users/user/Sites/project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 496

当将我传递给 new Student() 构造函数的内容转储时,它是学校模型的一个实例?

覆盖 Eloquent 模型构造函数会给您带来很多麻烦,请不要这样做。 Laravel 期望它应该能够 new static 在任何时候都没有问题,如果你向构造函数添加了一个必需的参数,它就不能做到这一点。

相反,我建议在你的模型中做这样的事情:

public static function connect(School $school)
{
    $host = $school->database;

    
    \Config::set('database.connections.school', [
        'driver'   => 'mysql',
        'host'     => $host->host,
        'port'     => $host->port,
        'database' => $host->database_name,
        'username' => $host->database_username,
        'password' => $host->database_password,
    ]);
    
    \DB::purge('school');

    return (new static)->setConnection('school');
}

现在在创建模型的新实例时使用您自己的方法,如下所示:

$student = Student::connect($this->selected_school)
    ->where('student_reference_code', $this->student_reference_code)
    ->first();