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文件中额外增加诸如上面的配置项,于是我有了下面的思考与探索。

思考

  1. 如何在运行时动态改变dbname,使之由laravel切换至mydb 经查阅,可以修改配置项的database.connections.mysql.database的值来实现
  2. 如果不改变database.connections.mysql.database的值,直接以mydb.mytable的形式访问数据库是否可以呢

探索

在上面的假想下,我开始了实践。

  1. 新建Model1,其$table='mytable';新建Controller1,其入口函数如下

        public function index()
        {
            Config::set('database.connections.mysql.database','mydb');
            $m1=new Model1();
            return $m1->all();
        }

    访问发现一切正常!于是这个思路行得通!

  2. 新建Model2,其$table='mydb.mytable';新建Controller2,其入口函数如下

        public function index()
        {
            $m2=new Model2();
            return $m2->all();
        }

    访问发现同样行得通!

意外

上面的探索使我逐步的感受到Laravel的强大,但是后面突然发现:在方案2使用之后,方案1的方式不再奏效了!! 于是我想既然方案2行的通就全部采用方案2,这样随时就可以切换dbname.


可是之后的探索中意外又发生了!!


新的问题背景

在某个场景中,我需要获取到数据库表的所有字段名称,经查询有两种方式

  1. Schema::getColumnListing($table)
  2. $m1=new Model1();$m1->getConnection()->getSchemaBuilder()->getColumnListing($m1->getTable())
  1. 使用上面方式1时,如果$table='table'(我默认数据中的一张表)在laravel(我的默认数据库名字)中,可以正确获得结果
  2. 使用方式1时,如果$table=laravel.table,返回结果为array()
  3. 使用方式2时,如果Model1.$table='mydb.mytable',返回结果为array();

综上,上面两种方式只能获取到默认数据库laravel下的表的字段信息,而无法获取到mydb下的表的字段信息


那么回到最初始的问题,应该怎么跨库访问,才不至于出现各种混乱的问题?


从逻辑上思考,或许Laravel应该提供应对上述问题的解决方案,所以是否这可以作为一个bug向官方提出?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!