【问题标题】:Laravel 5.8 dynamic database connection not being set in modelLaravel 5.8 动态数据库连接未在模型中设置
【发布时间】:2019-09-30 18:46:26
【问题描述】:

我正在尝试为我的每个模型创建动态数据库连接,以便可以使用 $model->setConnection('connection_name) 传递连接名称

我尝试了很多类似问题的答案,但没有任何效果

我创建了一个类,它创建一个新的数据库连接并将其添加到数据库配置中

<?php

namespace App;

use Illuminate\Support\Facades\Config;

class Clientdb
{
    public $connection;

    public function __construct($dbUser, $dbPassword, $dbName)
    {
        Config::set('database.connections.' . $dbUser, array(
            'driver'    => 'mysql',
            'host'      => '55.55.55.55',
            'port'      => '3306',
            'database'  => $dbName,
            'username'  => $dbUser,
            'password'  => $dbPassword,
            'unix_socket' => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_general_ci',
            'prefix'    => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                \PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ));

        $this->connection = $dbUser;
    }

    public function connection() {
        return $this->connection;
    }
}

在我的控制器中,我创建了一个新类的新实例以添加到数据库配置中,然后创建一个新的模型实例并将连接名称传递给我的模型 setConnection() 函数。

$this->clientdb = new Clientdb($dbUser, $dbPassword, $dbName);

$model = new \App\MyModel();
// dd($this->clientdb->connection);
$model->setConnection($this->clientdb->connection);
// dd($model);

$result = $model::where('id', $id)->first();

问题是它仍然尝试使用模型中设置的连接并且连接没有更新。如果我在模型中硬编码新的连接名称,它可以工作,但我需要使连接动态化,因为我不想继续手动添加到数据库配置中。

我错过了更新模型中的连接。

这是我的模型示例

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MyModel extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'my_table';

    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;

    /**
     * The connection name for the model.
     *
     * @var string
     */
    protected $connection = 'mysql';
}

sdfsf

【问题讨论】:

    标签: php laravel-5 eloquent database-connection


    【解决方案1】:

    对于动态数据库连接,你必须考虑两件事

    1. 您的数据库是静态的吗?

    2. 你想如何调用连接?

    在我的项目中,我的数据库名称不是静态的。客户端在登录期间更改数据库名称。所以我正在使用中间件,并且有一些复杂的代码。

    但是,如果您使用的是静态数据库,这意味着一个是 ENV,另一个是运行时。那么您只需几个步骤即可轻松完成此操作。

    1. Database.php config 中提及数据库名称

      创建一个新的连接数组,像这样:

      HOST 如果您要去其他主机,可以更改。否则你可以得到表格ENV

      'bio_db' => [
          'driver' => 'mysql',
          'host' => 'YOURHOST',
          'port' => env('DB_PORT', '3306'),
          'database' => 'YourDatabaseName',
          'username' => 'DBUSERNAME',
          'password' => 'DBPASSWORD',
          'unix_socket' => env('DB_SOCKET', ''),
          'charset' => 'utf8mb4',
          'collation' => 'utf8mb4_unicode_ci',
          'prefix' => '',
          'prefix_indexes' => true,
          'strict' => false,
          'engine' => "InnoDB",
      ],
      
    2. 像这样制作模型:

      class BioDevices extends Model
      {
          protected $connection="bio_db";
      
          protected $table="devices";
      
          protected $guarded = [];
      
          public $timestamps = false;
      
          protected $primaryKey="DeviceId";
      }
      
    3. 从控制器调用该表:

      public function test()
      {
          $data =BioDevices::get();
      
          return $data;
      }
      

    如果您已按照所有步骤操作,您将获得所需的输出,如下所示:

     [
       {
        DeviceId: 1,
        DeviceFName: "BABU ------ COLLEGE",
        DeviceSName: "1912003",
        DeviceDirection: "altinout",
        SerialNumber: "BKU719XXX5",
        ConnectionType: "TCP/IP",
        IpAddress: "",
        BaudRate: null,
        CommKey: "0",
              .......
         },
        .......
     ]
    

    【讨论】:

      【解决方案2】:

      它不起作用,因为$model::where() 等同于(new MyModel)-&gt;where()

      以非静态方法调用where()

      $result = $model->where('id', $id)->first();
                      ^^
      

      你也可以使用Model::on():

      $result = MyModel::on($this->clientdb->connection)->where('id', $id)->first();
      

      【讨论】:

        猜你喜欢
        • 2016-04-09
        • 2021-04-30
        • 1970-01-01
        • 2016-02-21
        • 2021-05-21
        • 2016-07-05
        • 2016-02-16
        • 2016-11-11
        • 2017-08-15
        相关资源
        最近更新 更多