在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 的连接有效,因为我可以从中获取数据。我的印象是它可以读取数据但不能保存它们。
编辑:
- 我在 config/database 中定义了多个连接。php
- my_db是我项目外的数据库
- 没有错误信息;只是一个空白页(
APP_DEBUG
设置为 true
,APP_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']);
文档中有几个地方是关于如何插入的:
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 的方法(见下文)。
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.php
的 connections
数组中定义的 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()
方法。
由于您在插入数据时没有遇到任何错误,因此似乎是两种情况之一:
- 您的交易以某种方式恢复
- 你的数据不会被刷新(只缓存在工作单元或类似的地方)
尝试删除 DB::connection('my_db')->beginTransaction();
和 DB::connection('my_db')->commit();
语句。
已解决:这是我的错误。我试图创建一个新记录,忘记指出所有不可为空的记录。我本可以通过更新有效而插入无效这一事实来弄清楚的。我确认 DB::connection('my_db')->table('my_table')->insert($data);
完美运行。
在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
设置为true
,APP_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']);
文档中有几个地方是关于如何插入的:
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 的方法(见下文)。
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.php
的 connections
数组中定义的 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()
方法。
由于您在插入数据时没有遇到任何错误,因此似乎是两种情况之一:
- 您的交易以某种方式恢复
- 你的数据不会被刷新(只缓存在工作单元或类似的地方)
尝试删除 DB::connection('my_db')->beginTransaction();
和 DB::connection('my_db')->commit();
语句。
已解决:这是我的错误。我试图创建一个新记录,忘记指出所有不可为空的记录。我本可以通过更新有效而插入无效这一事实来弄清楚的。我确认 DB::connection('my_db')->table('my_table')->insert($data);
完美运行。