mysql - Laravel 忽略多个数据库配置

标签 mysql laravel-5 eloquent

(永远不要在非常累的时候编写软件。否则你会在互联网上询问非常好的人来回答非常明显的问题,如果你不累的话你就不会问,因为原则问题是.. .琐碎。哈哈。所以,在这种情况下,我忽略了对备用数据库的连接属性进行唯一重命名。唉....)

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

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

但无论我做什么 Laravel/Eloquent/Doctrine 都会忽略所有让某些模型使用默认(公共(public))数据库,而其他模型使用 Multi-Tenancy 数据库的尝试。

让我们区分物理服务器、在该服务器上运行的数据库服务器实例、该实例中的数据库以及该数据库中的 Multi-Tenancy

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

  • 单一应用/数据库服务器、单一应用、单一数据库、 Multi-Tenancy
  • 单个应用/数据库服务器、单个应用、多个数据库、 Multi-Tenancy
  • 单个应用/数据库服务器、单个应用、多个数据库实例,每个实例都有多个数据库,具有 Multi-Tenancy
  • 单个应用服务器、多个数据库服务器、多个数据库实例,每个数据库实例都有多个租户。
  • 多个应用服务器、多个数据库服务器、多个数据库实例,每个数据库实例都有多个租户。
  • 及其任意组合。

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

感谢您的帮助。 -干杯

===环境文件===

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 文件===

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

//默认连接工作正常

===模型===

class EntityType extends BaseModel
{
    use SoftDeletes;

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

    ( ... )
}

//忽略 $connection

===控制台===

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

//使用默认连接

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

//忽略连接

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

//忽略连接,并从默认数据库返回数据

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

//忽略连接,但仍返回正确的数据....

最佳答案

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

换句话说,.ENV 文件的工作方式与 Config/App > Connection[] 定义相反。这……没有多大意义,也没有必要。

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

这可能是它应该如何工作,但事实并非如此。

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

解决方案:

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

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

  • (a) 使用默认(启动)数据库来存储相关的数据库连接配置并缓存它们 - 这会公开您的连接数据并强制您为新实例复制该数据,

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

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

干杯

关于mysql - Laravel 忽略多个数据库配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48097874/

相关文章:

MySQL 错误 : ASCII '\0' while importing sql file on linux server

php - 将 Laravel $validation->messages() 转换为对象数组的优雅代码

php - Laravel 5 - 上传后图像模糊 - 干预

php - 保存 Laravel 4 : Eloquent 时检测变化

MYSQL 查询在 phpmyadmin 上运行但不通过 ActiveCollab 中的 mysql_query

php - 如何为表名绑定(bind)值?

mysql - 当 WHERE 中使用其他表中的列时优化 JOIN

laravel - 在 Laravel 5.3 中,当我们将作业调度到作业队列后,如何获取作业 ID?

php - 如何将对象属性添加到对象的属性中?

php - 如何在 Lumen 5.5 中使用 .env 来使用多个数据库连接?