Laravel 数据库连接与访问问题
Laravel 数据库连接与访问问题
问题背景
在config/database
文件中定义了数据库连接方式,本人使用的Mysql,于是写了类似下面的配置信息:
'mysql' => [
'driver' => 'mysql',
'database' => env('DB_DATABASE'),//其值为`laravel`,其下有一张表`table`
'username' => env('DB_USERNAME'),
'prefix_indexes' => true,
'strict' => true,
...
],
但是在库laravel
外,我有一个库mydb
,其下有一张表mytable
,我需要是读写mydb.mytable
并且不想在config.database文件中额外增加诸如上面的配置项,于是我有了下面的思考与探索。
思考
- 如何在运行时动态改变dbname,使之由
laravel
切换至mydb
经查阅,可以修改配置项的database.connections.mysql.database
的值来实现- 如果不改变
database.connections.mysql.database
的值,直接以mydb.mytable
的形式访问数据库是否可以呢
探索
在上面的假想下,我开始了实践。
-
新建
Model1
,其$table='mytable'
;新建Controller1
,其入口函数如下public function index() { Config::set('database.connections.mysql.database','mydb'); $m1=new Model1(); return $m1->all(); }
访问发现一切正常!于是这个思路行得通!
-
新建
Model2
,其$table='mydb.mytable'
;新建Controller2
,其入口函数如下public function index() { $m2=new Model2(); return $m2->all(); }
访问发现同样行得通!
意外
上面的探索使我逐步的感受到Laravel的强大,但是后面突然发现:在方案2使用之后,方案1的方式不再奏效了!! 于是我想既然方案2行的通就全部采用方案2,这样随时就可以切换dbname.
可是之后的探索中意外又发生了!!
新的问题背景
在某个场景中,我需要获取到数据库表的所有字段名称,经查询有两种方式
Schema::getColumnListing($table)
$m1=new Model1();$m1->getConnection()->getSchemaBuilder()->getColumnListing($m1->getTable())
- 使用上面方式1时,如果
$table='table'
(我默认数据中的一张表)在laravel
(我的默认数据库名字)中,可以正确获得结果- 使用方式1时,如果
$table=laravel.table
,返回结果为array()
- 使用方式2时,如果
Model1.$table='mydb.mytable'
,返回结果为array()
;综上,上面两种方式只能获取到默认数据库
laravel
下的表的字段信息,而无法获取到mydb
下的表的字段信息
那么回到最初始的问题,应该怎么跨库访问,才不至于出现各种混乱的问题?
从逻辑上思考,或许Laravel应该提供应对上述问题的解决方案,所以是否这可以作为一个bug向官方提出?
推荐文章: