gpt4 book ai didi

database - Laravel 从另一个项目数据库获取数据

转载 作者:搜寻专家 更新时间:2023-10-30 23:27:43 26 4
gpt4 key购买 nike

我正在将旧项目数据库移动到新项目数据库。旧项目数据库的结构是单个MYSQL数据库,新项目是包含很多子域的 Multi-Tenancy 数据库。此外,新项目已经设置了一个 RESTFUL API 来接收来自旧项目的数据。因此,我的想法是在新项目中实现多连接,以便将两个数据库链接在一起,然后从旧项目中获取数据。例如,新项目 sales 表是空的,而旧项目 sales 表已经包含一些数据。现在在我的新项目界面中可能有一个同步按钮,以便将数据从旧数据库移动到新数据库中。在将数据发送到新项目之前是否需要传递 API key ?因为它是一个 Multi-Tenancy 结构。

这是我的配置/数据库

'mysql' => array(
'driver' => 'mysql',
'host' => 'aurora-2016-cluster.cluster-rtygfdfg.ap-southwest-1.rds.amazonaws.com',
'database' => 'newProject',
'username' => @$_ENV['DB_USER'] ?: '',
'password' => @$_ENV['DB_PASS'] ?: '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),

# Our secondary database connection
'mysql2' => array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'oldProject',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),

最佳答案

在 laravel 中非常简单打开你的 config/databse.php 文件

你会发现这样的代码

<?php

return [

/*
|--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for all database work. Of course
| you may use many connections at once using the Database library.
|
*/

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

/*
|--------------------------------------------------------------------------
| Database Connections
|--------------------------------------------------------------------------
|
| Here are each of the database connections setup for your application.
| Of course, examples of configuring each database platform that is
| supported by Laravel is shown below to make development simple.
|
|
| All database work in Laravel is done through the PHP PDO facilities
| so make sure you have the driver for your particular database of
| choice installed on your machine before you begin development.
|
*/

'connections' => [

'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],

'mysql' => [
'driver' => 'mysql',
'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', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
],

'pgsql' => [
'driver' => 'pgsql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],

'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
],

],

/*
|--------------------------------------------------------------------------
| Migration Repository Table
|--------------------------------------------------------------------------
|
| This table keeps track of all the migrations that have already run for
| your application. Using this information, we can determine which of
| the migrations on disk haven't actually been run in the database.
|
*/

'migrations' => 'migrations',

/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
| provides a richer body of commands than a typical key-value system
| such as APC or Memcached. Laravel makes it easy to dig right in.
|
*/

'redis' => [

'client' => 'predis',

'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],

'cache' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 1),
],

],

];

要遵循的步骤

第一步:向数据库连接数组添加新数组

'mysqlSecondConnection' => [
'driver' => 'mysql',
'host' => env('DB_HOST1', '127.0.0.1'),
'port' => env('DB_PORT1', '3306'),
'database' => env('DB_DATABASE2', 'secondDatabseName'),
'username' => env('DB_USERNAME2', 'secondDatabseUserName'),
'password' => env('DB_PASSWORD2', 'secondDatabsePassword'),
'unix_socket' => env('DB_SOCKET2', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],

在此之后你的文件可能看起来像

<?php

return [

/*
|--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for all database work. Of course
| you may use many connections at once using the Database library.
|
*/

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

/*
|--------------------------------------------------------------------------
| Database Connections
|--------------------------------------------------------------------------
|
| Here are each of the database connections setup for your application.
| Of course, examples of configuring each database platform that is
| supported by Laravel is shown below to make development simple.
|
|
| All database work in Laravel is done through the PHP PDO facilities
| so make sure you have the driver for your particular database of
| choice installed on your machine before you begin development.
|
*/

'connections' => [

'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],

'mysql' => [
'driver' => 'mysql',
'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', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
],

'mysqlSecondConnection' => [
'driver' => 'mysql',
'host' => env('DB_HOST1', '127.0.0.1'),
'port' => env('DB_PORT1', '3306'),
'database' => env('DB_DATABASE2', 'secondDatabseName'),
'username' => env('DB_USERNAME2', 'secondDatabseUserName'),
'password' => env('DB_PASSWORD2', 'secondDatabsePassword'),
'unix_socket' => env('DB_SOCKET2', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],


'pgsql' => [
'driver' => 'pgsql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],

'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
],

],

/*
|--------------------------------------------------------------------------
| Migration Repository Table
|--------------------------------------------------------------------------
|
| This table keeps track of all the migrations that have already run for
| your application. Using this information, we can determine which of
| the migrations on disk haven't actually been run in the database.
|
*/

'migrations' => 'migrations',

/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
| provides a richer body of commands than a typical key-value system
| such as APC or Memcached. Laravel makes it easy to dig right in.
|
*/

'redis' => [

'client' => 'predis',

'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],

'cache' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 1),
],

],

];

第 2 步:在 mysqlSecondConnection 数组中配置您的数据库名称

如果这个项目是团队协作,请不要忘记在 .ENV 文件中添加新属性

第 3 步:现在我们完成了数据库的配置

第 4 步:打开需要与 mysqlSecondConnection 数据库交互的模型

并添加

属性

protected $connection ='mysqlSecondConnection';

在此之后,模式可能看起来像例如:我将其视为 Post.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
/**
* Class Cat
*
* @package App
*/

class Post extends Model
{


/**
* The connection name for the model.
*
* @var string
*/
protected $connection ='mysqlSecondConnection';

/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = ['id'];

/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'posts';

/**
* The primary key for the model.
*
* @var string
*/

protected $primaryKey = 'id';

/**
* The "type" of the auto-incrementing ID.
*
* @var string
*/
protected $keyType = 'int';



/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name','title','desc'];

/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [];

/**
* @var array
*/
protected $dates = ['created_at','updated_at'];


}

就是这样

现在是测试部分

打开路由文件夹中的 web.php 文件

并粘贴以下代码

Route::get('/testSecondConnection', function () 
{
$posts= App\Post::all();
dd($posts);

});

现在导航到 yourApplication/testSecondConnection

现在看到转储中的 connection 属性

已编辑

实际上我忘了添加另一个通过 DB Facade 版本的方法

只需将连接名称传递给 connection 方法中的 DB

虽然使用这个不检查模型

对于 Post 模型中的 $connection 属性

$dbVersion = \DB::connection('mysqlSecondConnection')->table('posts')->get();
dd($dbVersion);

编辑但哪种方法更有效?

好问题伙计

情况一:

例如:

如果您在项目的所有情况下都将mysqlSecondConnection 用于Post 模型,那么将此添加到您的模型中

protected $connection ='mysqlSecondConnection';

这很好注意 $connection 属性将适用于 Eloquent 而不是 DB Facade

情况二:

`例如:'

如果您只使用少量查询和调用该 mysqlSecondConnection

你不需要添加

protected $connection ='mysqlSecondConnection';

发布模型

DB Facade Version 

$dbVersion = \DB::connection('mysqlSecondConnection')->table('posts')->get();
dd($dbVersion);

Eloquent Version

$eloquentVersion = Post::on('mysqlSecondConnection')->get()
dd($eloquentVersion);

您可能会怀疑为什么 DB FACADE 没有在 POST 模型中使用 mysqlSecondConnection

解决方法:

使用DB FACADE

它将查看 config/datbase.php

对于默认数组

用于连接数据库

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

希望它能帮到你,看起来很清楚

关于database - Laravel 从另一个项目数据库获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54288815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com