在Laravel 8中,如何将数据插入到在config/database.php中配置的数据库中?

In Laravel 8, how to insert data into a configured database in config/database.php?

config/database.php(Laravel 8)中是这样配置的:

'connections' => [
    'my_db' => [
        'driver' => 'mysql',
        'host' => 'xx.xx.xxx.xxx',
        'port' => '3306',
        'database' => 'Sqlxxx',
        'username' => 'Sqlxxxx',
        'password' => 'passxxx',
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
    ],
   'other_db' => [
        ...
    ],
],

我尝试保存一些数据,但它不起作用。

DB::connection('my_db')->beginTransaction();

$data = [];
$data["A"] = "a";
$data["B"] = "b";

$pdo = DB::connection('my_db')->getPdo();

if ($pdo) {
    DB::connection('my_db')
        ->table('my_table')
        ->insert($data);
}

DB::connection('my_db')->commit();

我指定与数据库 my_db 的连接有效,因为我可以从中获取数据。我的印象是它可以读取数据但不能保存它们。

编辑:

文档中有几个地方是关于如何插入的:

  1. The DB Facade's insert() method:
DB::insert('insert into example_table values (col_1, col_2), (?, ?)', ['col_1_value', 'col_2_value']); 

这使用绑定参数化查询直接插入默认连接的 example_table table。这似乎与 DB::connection(...)->insert() 不兼容,因为链接时使用的 insert() 方法与上面的方法不同,而是 Builder 的方法(见下文)。

  1. The Query Builder's insert() method:
DB::table('example_table')->insert(['col_1' => 'col_1_value', 'col_2' => 'col_2_value']);

Laravel 中的查询生成器是一个与数据库无关的包装器,用于允许与基于驱动程序(MySQL、PostGres 等)的数据库进行通信。它期望插入列的简单关联数组表示,如 ['a' => 'a', 'b' => 'b', ...],并根据提供的或默认的连接和指定的 table(即此 执行 insert 兼容 DB::connection()).

另一种方法是使用定义了指定连接的模型。例如,让我们定义一个 Example.php 模型,具有 my_db 连接:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Example extends Model {
  protected $connection = 'my_db';
  ...
}

因为我们正在设置 protected $connection = 'my_db';,所以对此模型的任何调用都会自动使用 config/database.phpconnections 数组中定义的 my_db 连接。示例:

$example = Example::create(['a' => 'a', 'b' => 'b']);

这将 运行 INSERT into examples (a, b) VALUES ('a', 'b'); 使用正确的数据库语法(MySQL、Postgres 等)。对 Example::update()Example::delete() 等的额外调用都会知道使用正确的连接。

我会推荐这种方法而不是 DB::connection()->table() 方法,并且 强烈建议 完全不建议使用 DB::insert() 方法。

由于您在插入数据时没有遇到任何错误,因此似乎是两种情况之一:

  1. 您的交易以某种方式恢复
  2. 你的数据不会被刷新(只缓存在工作单元或类似的地方)

尝试删除 DB::connection('my_db')->beginTransaction();DB::connection('my_db')->commit(); 语句。

已解决:这是我的错误。我试图创建一个新记录,忘记指出所有不可为空的记录。我本可以通过更新有效而插入无效这一事实来弄清楚的。我确认 DB::connection('my_db')->table('my_table')->insert($data); 完美运行。