【问题标题】:In Laravel 8, how to insert data into a configured database in config/database.php?在 Laravel 8 中,如何将数据插入到 config/database.php 中配置的数据库中?
【发布时间】:2021-10-09 17:10:10
【问题描述】:

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 的连接有效,因为我可以从中获取数据。我的印象是它可以读取数据但不能保存它们。

编辑:

  • 我在 config/database.php 中定义了多个连接
  • my_db 是我项目之外的数据库
  • 没有错误信息;只是一个空白页(APP_DEBUG 设置为 trueAPP_ENV 设置为 "local"
  • 我在脚本开头添加了DB::connection('my_db')->beginTransaction();,但无济于事。
  • 以下方式也不起作用:DB::connection('my_db')->insert('insert into my_table (A, B) values (?, ?)', ['a', 'b']);
  • 我吓坏了。更新有效,插入无效。这有效:DB::connection('my_db')->table('my_table')->where('id', '1')->update(['a' => '111']);

【问题讨论】:

  • 你能edit你的问题并添加错误信息吗?
  • @shaedrich 我找不到!脚本返回给我一个空白页......
  • 为什么不用播种机?
  • 最好将所有这些 cmets 作为Edit 包含在您的问题中????我们必须要求这么多澄清的事实意味着您的问题还不够清楚。
  • 这是 DB 外观的 insert() 方法的文档,它与 Eloquent/Builder 版本(我链接的)相似,但不完全相同。尽管如此,它应该像你写的那样工作,除非DB::connection() 使它无效。我尽量避免使用这些语句,因为它们与多种数据库类型不兼容(MySql、Postgres 等具有不同的语法),其中 Eloquent/Builder 适用于所有(嗯,大多数)数据库类型。

标签: php database laravel laravel-query-builder


【解决方案1】:

已解决:这是我的错误。我试图创建一个新记录,但忘记指出所有 NOT NULLABLE 记录。我本可以通过更新有效而插入无效这一事实来弄清楚这一点。我确认DB::connection('my_db')->table('my_table')->insert($data); 工作正常。

【讨论】:

  • @TimLewis 在我采取行动之前,我确保赏金归你所有。它会的。我没有直接将其分配给您,因为您的回复没有解决问题。如您所见,我使用它的方式是正确的。我不重视所有非空列是错误的。话虽这么说,赏金会来找你,因为无论如何我都喜欢你的答案,因为它在某种程度上帮助我推理。但是,你会明白,我不能接受你的回答是正确的。感谢您的关注!
  • 啊,也许我对赏金的工作方式不正确;我认为选择答案是分配它的方式(再次,不担心奖励?)。如果不是这种情况,那么请忽略我上面的大部分评论。是的,我理解添加此答案的原因,但通常如果问题是“我犯了一个错误并且没有处理 X”,那么将其作为对现有答案的评论并选择这是要走的路。那,或酌情关闭问题(语法错误,不可重现等)。只是一些关于 Stackoverflow 通常如何工作的思考 ?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    文档中有几个地方介绍了如何进行插入:

    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 表中。这似乎与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', ...],并根据提供的或默认的连接和指定的表执行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']);
    

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

    我会推荐这种方法而不是DB::connection()-&gt;table() 方法,并且强烈建议根本不使用DB::insert() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2016-03-19
      • 2020-05-01
      • 2021-10-27
      • 2020-08-26
      • 1970-01-01
      • 2023-02-01
      相关资源
      最近更新 更多