使用 laravel 将值从一个数据库复制到另一个数据库

Copy values from one database to another using laravel

我正在使用两个不同的数据库,一个称为“example”,另一个称为“example_hist”。我正在尝试创建一个 cron 作业来验证 table“用户”中的数据库“示例”是否存在任何状态为“已禁用”的用户。 如果有,它应该将用户行复制到数据库“example_hist”

中的 table 个“用户”

我的问题是我不知道该怎么做。

我已经连接了:

 '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', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

        'mysql2' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST_2', '127.0.0.1'),
            'port' => env('DB_PORT_2', '3306'),
            'database' => env('DB_DATABASE_2', 'forge'),
            'username' => env('DB_USERNAME_2', 'forge'),
            'password' => env('DB_PASSWORD_2', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

在我的 .env 中我有:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=example
DB_USERNAME=root
DB_PASSWORD=pass

DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=example_hist
DB_USERNAME_2=root
DB_PASSWORD_2=pass

我已经在内核中插入了命令,这是我现在的代码:

 public function handle()
    {
        $users = DB::table('users')->where('state', 'Disabled')->get();
 

        $user_hist = DB::connection('mysql2')->select('users');
      //should be something here that copies the row from $users 
    }

再创建一个字段作为复制,默认为false,复制到其他数据库后为true

运行 状态为禁用且未复制的查询

 $users = DB::table('users')->where('state', 'Disabled')
        ->where("copied", "=", 0)->get();

运行 用户循环

foreach ($users as $user){

            //Now using connection insert into another table of another db
            DB::connection('mysql2')->insert('insert into users (name, email, mobile, password, created_at, state) values (?,?,?,?,?,?)',  array($user->name , $user->email , $user->mobile,   $user->password, $user->created_at,  $user->state ) );


            //Make user copied status to true so next time it wont copied again
            $user->copied = true;
            $user->save();
        }

好吧,在@Teekay 的帮助下,我找到了正确的解决方案。这对我有用。希望这可以帮助任何遇到同样问题的人。

 public function handle()
    {

    $users = DB::table('users')->where('state', 'Disabled')->where("copied",'false')->get();

    if($users){

    foreach ($users as $user){

     DB::connection('mysql2')->insert('insert into users (name, email, mobile, password, created_at, state) values (?,?,?,?,?,?)',  array($user->name , $user->email , $user->mobile,   $user->password, $user->created_at,  $user->state ) );

     DB::table('users')->where('state', 'Disabled')->where("copied", 'false')->update(['copied' => 'true']);

    }
}
}