【问题标题】:Having trouble with using multiple database in laravel 5.7?在 laravel 5.7 中使用多个数据库时遇到问题?
【发布时间】:2020-02-04 01:48:57
【问题描述】:

我在使用 Laravel 5.7 时遇到问题,它无法识别第二个数据库连接。数据库 2 有一个数据库 1 没有的“国家”表。但是laravel坚持连接数据库1。这是错误和实际代码,请帮助!提前致谢

错误

SQLSTATE[42S02]:未找到基表或视图:1146 表 'database_1.countries' 不存在(SQL: select * from countries)

型号

class Country extends Model {

    use SoftDeletes;

    protected $connection = 'mysql_2';
    protected $table      = 'countries';
    protected $fillable = ['...'];

}

控制器/调试器

class CountriesController extends Controller {

    public function index(){

       //  neither works, this

       $countries = DB::connection("mysql_2")->select('select * from countries');

       // or this

       $countries = Country::all();

       dd($countries); --> both give ERROR
}

数据库.PHP

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

    'connections' => [

        'mysql' => [
            'driver'        => 'mysql',
            'host'          => env('DB_HOST', '127.0.0.1'),
            'port'          => env('DB_PORT', '3306'),
            'database'      => env('DB_DATABASE', 'database_1'), //forge
            'username'      => env('DB_USERNAME', 'root'), // forge
            'password'      => env('DB_PASSWORD', ''),
             .......
        ],

        'mysql_2' => [
            'driver'        => 'mysql',
            'host'          => env('DB_HOST', '127.0.0.1'),
            'port'          => env('DB_PORT', '3306'),
            'database'      => env('DB_DATABASE', 'database_2'),
            'username'      => env('DB_USERNAME', 'root'),
            'password'      => env('DB_PASSWORD', ''),
            .......
       ],

.ENV 文件

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database_1
DB_USERNAME=root
DB_PASSWORD=

DB_CONNECTION=mysql_2
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database_2
DB_USERNAME=root
DB_PASSWORD=

并且缓存已更新:

php 工匠配置:缓存

  Configuration cache cleared!
  Configuration cached successfully!

【问题讨论】:

  • 对于同一个变量名,.env 文件中不能有多个值。您需要 DB_CONNECTION_2DB_HOST_2 等以具有不同的值。
  • 感谢 Matti,您的 cmets 与 Steven 一样完美,非常感谢!

标签: laravel eloquent


【解决方案1】:

您可以尝试的另一个过程 -

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database_1
DB_USERNAME=root
DB_PASSWORD=

CUSTOM_DATABASE=database_2
CUSTOM_USERNAME=root
CUSTOM_PASSWORD=

database.php

'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        ...................................
    ],
'custom' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('CUSTOM_DATABASE', 'forge'),
        'username' => env('CUSTOM_USERNAME', 'forge'),
        'password' => env('CUSTOM_PASSWORD', ''),
        ..........................................
    ],

YourModel.php

protected $connection = 'custom';
protected $fillable = [......];

如果您在模型中使用protected $connection,那么您可以像往常一样使用 eloquent。如果是这样,那么您可以像这样运行您的查询 -

$countries = Country::all();

在您的迁移文件中 -

public function up()
{
    Schema::connection('custom')->create('your-table-name', function (Blueprint $table){
        $table->bigIncrements('id');
        ...........................
        $table->timestamps();
    });
}

【讨论】:

    【解决方案2】:

    在你的 database.php 文件中尝试更改

    'mysql_2' => [
                'driver'        => 'mysql',
                'host'          => env('DB_HOST', '127.0.0.1'),
                'port'          => env('DB_PORT', '3306'),
                'database'      => env('DB_DATABASE2', 'database_2'), // THIS IS THE ONE THATS CHANGED
                'username'      => env('DB_USERNAME', 'root'),
                'password'      => env('DB_PASSWORD', ''),
                .......
           ],
    

    .ENV 文件

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=database_1
    DB_USERNAME=root
    DB_PASSWORD=
    
    DB_CONNECTION=mysql_2
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE2=database_2 // We change 'DB_Database' to 'DB_Database2'
    DB_USERNAME=root
    DB_PASSWORD=
    

    【讨论】:

    • 感谢 Steven,效果很好!你知道为什么第一个代码有效而第二个无效吗? // 这个工作 $countries = DB::connection('mysql_test_2')->select('select * from countries'); // 这不是 $countries = Country::select('*')->get(); dd($国家);非常感谢!
    • 很高兴为您提供帮助!不要忘记标记为最佳答案,:)
    • 您是否导入了 Country 模型?尝试了您的第二个示例,它仅适用于我的应用程序。此外,如果您要获取该表上的所有列,而不是输入select(*),您可以直接输入get(),如果您要使用雄辩的方法。如果您选择特定列,请使用 select()。例如 ($countries = Country::select('id','countryName')->get();)
    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2021-10-21
    • 2019-10-01
    相关资源
    最近更新 更多