Laravel忽略多个数据库配置

时间:2018-01-04 14:56:14

标签: mysql laravel-5 eloquent

(当你很累的时候不要写软件。否则你会在互联网上要求非常好的人回答非常明显的问题,你不会问,如果你不累,因为原则问题是......琐事。大声笑。所以,在这种情况下,我忽略了唯一地重命名备用数据库的连接属性。叹气....)

问题: 我无法让Laravel识别出对不同连接(数据库)的请求。

据我所知,我已正确配置 .ENV,config / database.php,config / app.php ,并添加 $ connection = myconnection 我的模特。

但无论我做什么Laravel / Eloquent / Doctrine忽略所有尝试让某些模型使用默认(通用)数据库,其他人使用多租户数据库。

让我们区分物理服务器,在该服务器上运行的数据库服务器实例,该实例中的数据库,以及该数据库中的多租户

我应该可以通过在运行时修改连接来使用任何这些配置:

  • 单个应用程序/数据库服务器,单个应用程序,单个数据库,具有多租户
  • 单个应用程序/数据库服务器,单个应用程序,多个数据库,具有多租户
  • 单个应用程序/数据库服务器,单个应用程序,多个数据库实例,每个实例都有多个数据库,具有多租户
  • 单个应用服务器,多个数据库服务器,多个数据库实例,每个实例都有多个租户。
  • 多个应用服务器,多个数据库服务器,多个数据库实例,每个实例都有多个租户。
  • 及其任何组合。

我怀疑缺少文档,但是包含了雄辩/模型功能“$ connection = connection_configuration”意味着有一个相当明显的解决方案,我不会直觉。 (而且我没有几天的时间来深入研究来源,并弄清楚那里发生了什么。)

感谢您的帮助。 -Cheers

=== ENV FILE ===

DB_CONNECTION=crunch
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=crunch
DB_USERNAME=myapp
DB_PASSWORD=Nonsense!Talk

DB_CONNECTION=munchdata
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=munchdata
DB_USERNAME=myapp
DB_PASSWORD=Nonsense!Talk

=== CONFIG / database.php中===

'connections' => [

    'crunch' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'crunch'),
        'username' => env('DB_USERNAME', 'crunch'),
        'password' => env('DB_PASSWORD', 'Nonsense!Talk'),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
        'sticky' => true,
    ],

    'munchdata' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'munchdata'),
        'username' => env('DB_USERNAME', 'munchdata'),
        'password' => env('DB_PASSWORD', 'Nonsense!Talk'),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
        'sticky' => true,
    ],

],

=== CONFIG / APP.PHP FILE ===

'default' => env('DB_CONNECTION', 'crunch'),

//默认连接正常

===模特===

class EntityType extends BaseModel
{
    use SoftDeletes;

    public $connection = 'munchdata';
    public $table = 'entity_type';

    ( ... )
}

//忽略$ connection

=== CONSOLE ===

>>> DB::connection('crunch')->getDatabaseName()
=> "crunch"

//使用默认连接

>>> DB::connection('munchdata')->getDatabaseName()
=> "crunch"
>>>

//忽略连接

$result = DB::connection('munchdata')->select('select * from entity_type');

//忽略连接,并从默认db

返回数据
$result = DB::connection('munchdata')->select('select munchdata.entity_type.* from munchdata.entity_type');

//忽略连接,但无论如何都会返回正确的数据....

1 个答案:

答案 0 :(得分:1)

.ENV文件中的值必须是唯一的,因为值“DB_CONNECTION = myDatabaseName”不是从“myDatabaseName”键入的数组,而是“哑”字符串值。这意味着.ENV文件中的所有条目都必须唯一命名。

换句话说,.ENV文件可以从Config / App>中完全工作。连接[]定义。哪个...没有多大意义,也没有必要。

我假设.ENV文件被带入一个数组,myDatabaseName作为键,“DB_ *”字符串是常量。这似乎是合乎逻辑的。

这可能是它应该如何运作的,但它不是如何运作的。

我想,因为我看到很多其他人因为类似的假设发布问题,我们应该请求更改,或者我应该编写一些代码以允许多个配置使用相同的常量作为键。

解决方案:

  • (1)如果您拥有少量相对不变的数据库,请继续使用.ENV文件 - 并为每个CONSTANT提供不同的名称。

  • (2)如果动态创建新数据库,请使用.ENV作为默认(引导)数据库,然后:

  • (a)使用默认(引导)数据库来存储相关的数据库连接配置并对其进行缓存 - 这会暴露您的连接数据并迫使您为新实例复制该数据,

  • 或(b)使用文件系统存储相关的数据库配置,并(c)缓存它们。

  • 在我的情况下,我有N(很多)数据库,我更喜欢使用db然后复制(转储并加载带有连接信息的表)而不是一个未知大小的文件,有可能'由于开发/ IT错误或恶意而泄漏到现实世界......

干杯