草庐IT

php - 根据域更改数据库连接

coder 2023-10-06 原文

我们有多个域在同一个应用程序上运行。

目前,我们的数据库环境设置将配置数据库复制到每个数据库服务器。从服务器拥有配置数据库和用户数据库。

我们通过检查使用的域来确定 RouteServiceProvider.php 上的数据库连接。

域 1 将连接到数据库服务器 A (config_db + A_user_db)。 示例:

database.php

'connections' => [  
    'db_config' => [
        'driver' => 'mysql',
        'host' => '192.168.0.10', 
        'port' => 'XXXX',
        'database' => 'config_db',
        'username' => 'xxxx',
        'password' => 'xxxx'
    ],    

    'db_user_a' => [
        'driver' => 'mysql',
        'host' => '192.168.0.10', 
        'port' => 'XXXX',
        'database' => 'a_user_db',
        'username' => 'xxxx',
        'password' => 'xxxx'
    ],    

]

域 2 将连接到数据库服务器 B (config_db + B_user_db)。 示例:

database.php

 'connections' => [   
    'db_config' => [
        'driver' => 'mysql',
        'host' => '192.168.0.5', 
        'port' => 'XXXX',
        'database' => 'config_db',
        'username' => 'xxxx',
        'password' => 'xxxx'
    ],      
    'db_user_b' => [
        'driver' => 'mysql',
        'host' => '192.168.0.5', 
        'port' => 'XXXX',
        'database' => 'b_user_db',
        'username' => 'xxxx',
        'password' => 'xxxx'
    ],      
]

与同一台服务器上的用户数据库连接的config db的用法如下:

   $db_config = config('database.connections.db_config.database').'.';
   $data['bank_name'] = User::rightJoin($db_config.'config_bank as cb','user.bank_id','=','cb.bank_id')->first(['cb.bank_name']); 

我们如何保持我们的 db_config 灵活地与当前用户数据库连接?

我们在数据库中定义了数据库的每个数据库连接,我们尝试使用配置常量,但我们的模型无法读取配置的连接。

   class RouteServiceProvider extends ServiceProvider
   {
/**
 * This namespace is applied to your controller routes.
 *
 * In addition, it is set as the URL generator's root namespace.
 *
 * @var string
 */
protected $namespace = 'App\Http\Controllers';

/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    //
    // get the encrypter service
    $encrypter = app(\Illuminate\Contracts\Encryption\Encrypter::class);

    if(Request()->go) {
         $basepath = Request()->go;
         Cookie::queue('go', $basepath, 60*24*7);                   
    }  

    $row=Partner_domain::where('basepath',$basepath)->first();
    if(($row)){ 
          // returns db_user_a OR db_user_b 
        config(['database.default'     => $row->db_name]); 
    }

    parent::boot();
}

预期结果:

config('database.connections.db_config.database') 将具有灵活的值(value)。

最佳答案

默认连接已在 Partner_domain 模型中建立。

因此,您必须更改设置,然后重新连接默认连接。

路由服务提供者

    $row=Partner_domain::where('basepath',$basepath)->first();
    if(($row)){
          // returns db_user_a OR db_user_b
        config(['database.default'     => $row->db_name]);
        config(['database.connections.db_config.host' => '192.168.0.5']);  // change host
        DB::reconnect();
    }

Recommend: Separate the database connection from the Partner_domain. (ex. database.connections.db_partner_domain)

模型

无法加入两个数据库连接。您必须使用模型关系运行查询两次,如下所示:

  1. 创建 ConfigBank 模型。
class ConfigBank extends Model
{
    protected $connection = 'db_config';

    protected $table = 'config_bank';

    public function user()
    {
        return $this->belongsTo(User::class, 'bank_id', 'bank_id');
    }
}
  1. 将关系添加到“用户”模型。
class User extends Model
{
    public function configBank()
    {
        return $this->hasOne(ConfigBank::class, 'bank_id', 'bank_id');
    }
}
  1. 使用两个数据库连接。
$user = User::find(1);   // test data
if ($user && $user->configBank) {
    $data['bank_name'] = $user->configBank->bank_name;
}

关于php - 根据域更改数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57156728/

有关php - 根据域更改数据库连接的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  5. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  6. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  7. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  8. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  9. ruby - 更改 ActiveRecord 中对象的类 - 2

    假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐