RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 957503
Accepted
Vladimir Gonchar
Vladimir Gonchar
Asked:2020-03-17 11:02:44 +0000 UTC2020-03-17 11:02:44 +0000 UTC 2020-03-17 11:02:44 +0000 UTC

连接到标准 Laravel 配置中未填写的第三方数据库

  • 772

使用 laravel 5.8.0。有几个数据库,其中的数据是从管理面板填充的。当然,数据不会进入标准配置 (/config/database.php),而是记录并存储在单独的 JSON 配置 (/storage/app/databases.json) 中。

问题是: 我怎样才能连接到第三方数据库,而不是通过手动将数据输入到配置中,而是使用我自动获取的数据进行连接?

我知道存在setConnection()。试图写这样的东西:

$servers = conf()->get('servers'); //Пакет garf/laravel-conf, тут у меня массив с информацией по базам
foreach($servers as $server){
    if(empty(Config::get("database.connection.".$server['name_database']))){
        Config::set( // И через config() тоже работать не будет
            'database.connection.'.$server['name_database'],
            [
                'driver' => 'mysql',
                'host' => $server['ip_database'] ?? '127.0.0.1',
                'port' => $server['port_database'] ?? 3306,
                'database' => $server['name_database'],
                'username' => $server['user_database'],
                'password' => $server['pass_database'],
                'unix_socket' => '',
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_unicode_ci',
                'prefix' => '',
                'prefix_indexes' => true,
                'strict' => true,
                'engine' => null,
            ]
        );
    }
    $punishment = new Punishment;
    $punishment->setConnection($server['name_database']);
    $list = $punishment->where('name', '=', Auth::user()->name);
}

但是 Laravel 想以编程方式在其配置中输入一些东西,所以我得到一个错误:

InvalidArgumentException 未配置数据库 [server_classic]。

PS我只是没有看到直接(通过相同的PDO)编写连接的意义。并且不要写“使用一个基地”,这里不会这样,因为第三方基地在游戏服务器和服务器本地使用,您只需要不时到站点获取一些信息即可时间。

база-данных
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    P. Fateev
    2020-03-18T15:34:25Z2020-03-18T15:34:25Z
    1. 创建一个继承\Illuminate\Database\DatabaseManager并覆盖configuration(). 例如,我在\App\Database\DatabaseManager. 结果应如下所示:

      <?php
      
      namespace App\Database;
      
      use \Illuminate\Database\DatabaseManager as BaseDatabaseManager;
      
      class DatabaseManager extends BaseDatabaseManager
      {
          protected function configuration($name)
          {
              // аргумент $name содержит название подключения
      
              // по названию подключения находим и возвращаем соответствующий конфиг
              $servers = conf()->get('servers');
              if (!empty($servers[$name])) {
                  $server = $servers[$name];
                  return [
                      'driver' => 'mysql',
                      'host' => $server['ip_database'] ?? '127.0.0.1',
                      'port' => $server['port_database'] ?? 3306,
                      'database' => $server['name_database'],
                      'username' => $server['user_database'],
                      'password' => $server['pass_database'],
                      'unix_socket' => '',
                      'charset' => 'utf8mb4',
                      'collation' => 'utf8mb4_unicode_ci',
                      'prefix' => '',
                      'prefix_indexes' => true,
                      'strict' => true,
                      'engine' => null,
                  ];
              }
      
              return parent::configuration($name);
          }
      }
      
    2. 用我们修改的类替换默认的 DatabaseManager,创建你自己的DatabaseServiceProvider:

      php artisan make:provider DatabaseServiceProvider
      

    Laravel 会一路创建它\App\Providers\DatabaseServiceProvider。像这样改变它的代码:

    <?php
    
    namespace App\Providers;
    
    use App\Database\DatabaseManager;
    use Illuminate\Database\Connectors\ConnectionFactory;
    use Illuminate\Database\DatabaseServiceProvider as BaseDatabaseServiceProvider;
    
    class DatabaseServiceProvider extends BaseDatabaseServiceProvider
    {
        protected function registerConnectionServices()
        {
            $this->app->singleton('db.factory', function ($app) {
                return new ConnectionFactory($app);
            });
    
            $this->app->singleton('db', function ($app) {
                // здесь создается объект нашего кастомизированного менеджера вместо стандартного
                return new DatabaseManager($app, $app['db.factory']);
            });
    
            $this->app->bind('db.connection', function ($app) {
                return $app['db']->connection();
            });
        }
    }
    
    1. config/app.php在该部分的文件中,providers将标准文件替换DatabaseServiceProvider为新文件:

      //Illuminate\Database\DatabaseServiceProvider::class,
      \App\Providers\DatabaseServiceProvider::class,
      

    它应该如何工作。

    在 DatabaseManager::configuration() 中,您可以实现任何逻辑来获取连接到数据库的配置。此输入方法接收连接的名称,该名称写入(或动态指定)在模型的 $connection 属性中或通过 DB::connection() 显式指定,并返回连接所需的参数数组。

    适用于您的情况。您可以通过这种方式获得所有连接设置:

    $servers = conf()->get('servers');
    

    $servers你应该有这样的结构:

        $servers = [
            'connection_1' => [
                'driver' => 'mysql',
                'host' => 'host_1',
                ...
                // остальные параметры подключения к первой БД
            ],
            'connection_2' => [
                'driver' => 'mysql',
                'host' => 'host_2',
                ...
                // остальные параметры подключения ко второй БД
            ],
        ];
    

    您可以在不同的数据库上使用相同的模型,如下所示:

    $punishment = new Punishment();
    
    $punishment->setConnection('connection_1');
    dump($advert->count()); // будет выведено количество моделей в первой БД
    
    $punishment->setConnection('connection_2');
    dump($advert->count()); // будет выведено количество моделей во второй БД
    

    或者通过直接访问表进行相同的操作:

    // получение количества записей таблицы в первой БД
    dump(\DB::connection('connection_1')->table('punishments')->count());
    
    // получение количества записей таблицы во второй БД
    dump(\DB::connection('connection_2')->table('punishments')->count());
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5