我们有多个域在同一个应用程序上运行。
目前,我们的数据库环境设置将配置数据库复制到每个数据库服务器。从服务器拥有配置数据库和用户数据库。
我们通过检查使用的域来确定 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)
无法加入两个数据库连接。您必须使用模型关系运行查询两次,如下所示:
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');
}
}
class User extends Model
{
public function configBank()
{
return $this->hasOne(ConfigBank::class, 'bank_id', 'bank_id');
}
}
$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/
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我主要使用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
我正在使用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].有没有一种方法可以
我在我的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服务器更新战俘
我尝试使用不同的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
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我使用的是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上找到一个类
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
我正在尝试使用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_