[求助] [Laravel 5.2] 如何利用Laravel driver访问多个不在app\config\database.php里得sqlite3数据库

有多个sqlite数据库源文件,没有放在app\\config\\database.php中管理,但是自己想使用Laravel的数据库driver来操作这些数据,有什么办法在操作数据库前,更改connections->'sqlite'->'database'的值呢?

'connections' => [

        'sqlite' => [
            'driver'   => 'sqlite',
            'database' => database_path('database.sqlite'), <== 我想更换的数据源文件
            'prefix'   => '',
        ],

        'mysql' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => env('DB_DATABASE', 'forge'),
            'username'  => env('DB_USERNAME', 'forge'),
            'password'  => env('DB_PASSWORD', ''),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
            'engine'    => null,
        ],
    ],<br></br>

之前也Google到了两个帮助信息,不过都是如何切换在database.php中已经配置了的数据库的,在我需求中,把所有sqlite数据库都放在database.php中不太现实。

http://fideloper.com/laravel-multiple-database-connections| c87189d1f153740857d5f6c73048d3d31 |

http://stackoverflow.com/questions/31847054/how-to-use-multiple-database-in-laravel| c87189d1f153740857d5f6c73048d3d33 |

非常感谢!!!

    // eloquent class.
    // add dynamic sqlite database setting.
    protected static $sqliteDatabase = 'yourname';

    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot(); // TODO: Change the autogenerated stub
        // We do config here.
        if ($sqlite = static::$sqliteDatabase) {
            app()['config']->set('database.connections.sqlite.database', $sqlite);
        }
    }
Tomoe

想到幾個方法:

ENV

在環境文件 .env 中設個值 , 例如


CURRENT_DATABASE=/a/b/c/master.sqlite

然後可以在 database.php 中:

<?php

// 第二個參數是當.env中不存在 CURRENT_DATABASE 時的預設值

'sqlite' => [
    'driver'   => 'sqlite',
    'database' => env('CURRENT_DATABASE', '/a/b/c/default.sqlite'),
    'prefix'   => '',
],

JSON

或是直接在別的地方建立 json 文件,再去讀取,例如我在專案目錄底下建立個 database.json

{
  "current": "slave",
  "slave" : {
      "path": "/a/b/slave.sqlite"
  },
  "master" : {
      "path": "/a/b/master.sqlite"
  }
}

然後在 database.php 中,去讀取並解析:

<?php

$database = json_decode(file_get_contents(base_path('database.json')), true);

// 吃掉

'sqlite' => [
    'driver'   => 'sqlite',
    'database' => $database[$database['current']]->path,
    'prefix'   => '',
],

第二種方法的優點在於可以放其他額外資料,不受限於 .env 只能單純設定變數值

justtest
    // eloquent class.
    // add dynamic sqlite database setting.
    protected static $sqliteDatabase = 'yourname';

    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot(); // TODO: Change the autogenerated stub
        // We do config here.
        if ($sqlite = static::$sqliteDatabase) {
            app()['config']->set('database.connections.sqlite.database', $sqlite);
        }
    }
sunnirvana

@justtest 谢谢答案,真符合我的需求。还有两个问题:

  1. 下面这句笔误了吧?
    if (sqlite=static::sqlite = static::sqliteDatabase) {

  2. app()['config]->set 类似这种接口有文档可以参考吗?还是要直接看源码?

JellyBool

靠老司机的经验值,哈哈哈 @sunnirvana

justtest

@sunnirvana 没测试,你自己看执行不对就修改吧。
文档中忘记了有没有,估计要看容器和设置相关的内容,我是凭感觉写的,以前应该是用过。
app() 返回容器, 容器对象实现了几个数组接口所以可以用下标访问,得到 config 对象, config 对象上应该有 get 和 set 方法。

sunnirvana

@JellyBool 既然上车了,就要靠老司机带路了,哈哈!

sunnirvana

@justtest 试验了,可用,非常感谢!