laravel忽略多个数据库配置

mnowg1ta  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(323)

(不要在你很累的时候写软件。否则你在网上问很好的人回答很明显的问题,你不会问,如果你不累,因为原则问题是。。。琐碎的。所以,在这个例子中,我忽略了唯一地重命名备用数据库的连接属性。叹息……)
问题:我无法使laravel识别对其他连接(数据库)的请求。
据我所知,我已经正确配置了.env、config/database.php、config/app.php,并在模型中添加了$connection=myconnection。
但是不管我怎么做,laravel/elokent/doctrine忽略了所有让一些模型使用默认(公共)数据库,而其他模型使用多租户数据库的尝试。
让我们区分物理服务器、在该服务器上运行的数据库服务器示例、该示例中的数据库以及该数据库中的多租户。
我应该能够通过在运行时修改连接来使用以下任何配置:
单应用程序/数据库服务器、单应用程序、单数据库、多租户
单应用程序/数据库服务器、单应用程序、多数据库、多租户
单个应用程序/db服务器,单个应用程序,多个数据库示例,每个示例具有多个数据库,具有多个租户
单个应用服务器、多个数据库服务器、多个数据库示例,每个示例具有多个示例。
多个应用服务器、多个数据库服务器、多个数据库示例,每个示例都有多个示例。
以及它们的任何组合。
我怀疑缺乏文档,但是包含了雄辩的/模型特性“$connection=connection\u 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

===配置/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';

    ( ... )
}

//忽略$连接
===控制台===

>>> 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');

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

mpbci0fu

mpbci0fu1#

.env文件中的值必须是唯一的,因为值“db\u connection=mydatabasename”不是从“mydatabasename”键入的数组,而是“dumb”字符串值。意味着.env文件中的所有条目必须具有唯一的名称。
换句话说,.env文件的工作方式与config/app>connection[]定义相反。哪个。。。没什么意义,也没必要。
我假设.env文件被带入一个以mydatabasename为键的数组中,“db_u2;*”字符串是常量。这似乎合乎逻辑。
这可能是它应该如何工作,但不是它如何工作。
我想,因为我看到许多其他人因为类似的假设而发帖提问,要么我们应该请求更改,要么我应该编写一些代码,允许多个配置使用相同的常量作为键。
解决方案:
(1) 如果有少量相对不变的数据库,请继续使用.env文件,并为每个常量指定不同的名称。
(2) 如果动态创建新数据库,请使用.env作为默认(启动)数据库,然后:
或者(a)使用您的默认(引导)数据库存储相关的数据库连接配置并缓存它们—这会公开您的连接数据并强制您为新示例复制该数据,
或者(b)使用文件系统存储相关的数据库配置,以及(c)缓存它们。
在我的例子中,我有n(很多)个数据库,我更喜欢使用db然后复制(转储并加载带有连接信息的表),而不是一个未知大小的文件,因为开发/it错误或恶意而有可能“泄漏”到现实世界中。。。
干杯

相关问题