【问题标题】:How to I specify Tinker to use a different database connection?如何指定 Tinker 使用不同的数据库连接?
【发布时间】:2018-09-13 22:47:22
【问题描述】:

我有两个数据库连接。一个用于我的应用程序,另一个用于测试。 在我的 ..\config\database.php

         '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,
        ],

        'testing' => [
            'driver'    => 'mysql',
            'host'      => env('DB_TEST_HOST', 'localhost'),
            'database'  => env('DB_TEST_DATABASE', 'forge'),
            'username'  => env('DB_TEST_USERNAME', 'forge'),
            'password'  => env('DB_TEST_PASSWORD', ''),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],

我可以在播种中更改数据库连接

php artisan db:seed --database=testing

我想使用 tinker 进行连接“测试”,但无法更改。有什么办法可以改变类似于数据库种子的修补程序的数据库连接?

【问题讨论】:

    标签: database laravel laravel-5.1 laravel-artisan tinker


    【解决方案1】:

    由于您的问题从使用一个数据库进行测试/开发和一个用于生产开始,您应该考虑使用不同的环境,这将使您的代码在部署和本地测试之间没有任何变化。


    通过指定您的环境可以轻松完成此任务:

    php artisan tinker --env=local
    

    默认情况下,如果您不指定--env,您将使用/your-app/.env

    当使用local 时,您从/your-app/.env.local 读取变量


    针对您的特定用例:

    php artisan db:seed --env=local
    

    延伸阅读:https://laravel.com/docs/5.6/configuration

    注意:您应该避免将“.env”文件签入 VCS,.env.local 应该可以共享,但最好不要将生产凭据与您的 VCS 捆绑在一起。

    【讨论】:

    • 我目前正在使用不同的数据库进行测试(PHPUnit)和开发。我需要使用 php artisan tinker 来测试数据库。我是否需要分别更改我的 env 文件以进行测试和开发?是的,你的回答对我也有帮助。
    • 我建议使用不同的环境,是的。这绝不是您必须遵循的。
    • 不幸的是,无论我是否指定env,我都无法修改以遵守.env 中的日志设置,并且即使出现错误,我的日志中也不会出现任何内容。
    • @Ryan,很抱歉在这里聚会迟到了,但对于未来好奇的人:这很可能是由于文件权限错误。
    【解决方案2】:

    要从 within tinker 将默认数据库连接设置为“mysql_test”,我使用以下命令:

    >>> use DB
    >>> DB::setDefaultConnection('mysql_test');
    

    当您想要测试迁移和播种器而不弄乱现有(工作)本地数据库时,它特别有用。

    【讨论】:

      【解决方案3】:

      更改默认连接

      $model_instance = new App\YourModel();
      $model_instance->setConnection('new_connection');
      $data = $model_instance->find(1);
      

      【讨论】:

      • 没有。它没有帮助。
      • @DonRaider 请尝试更新答案并告诉我
      • 谢谢。它确实有帮助。还有一个问题。我可以将 php artisan tinker 的默认连接更改为测试而不是 mysql 数据库连接吗?
      • 是的,你可以。请记住,如果您可以在控制器代码中更改默认连接,那么您也可以在 tinker 中执行此操作,类似
      • @Soulriser 我也这么认为。我的回答只提供了一个解决方案,而不是最好的解决方案。
      猜你喜欢
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      相关资源
      最近更新 更多