【发布时间】:2018-11-28 04:06:51
【问题描述】:
我正在我的 Laravel 项目中编写一个命令,该命令将类别插入数据库表,但取决于它们是否已经存在。
我研究了这样做的方法并遇到了firstOrCreate方法,所以我在我的命令中写了以下内容:
$comCats = new CommunicationsCategories();
$comCats->firstOrCreate(
['name' => 'Job Updates'], ['region_id' => 1]);
$comCats->firstOrCreate(
['name' => 'Alerts'], ['region_id' => 1]);
基本上,我需要在区域 ID 为 1 的communications_categories 表中创建这两个类别。 Job Updates 类别已经存在,因此它按预期跳过了该类别,但是当它尝试创建不存在的 Alerts 类别时我在控制台中收到以下错误:
SQLSTATE[23505]:唯一违规:7 错误:重复键值 违反唯一约束“communications_categories_pkey”
详细信息:键 (id)=(2) 已存在。 (SQL:插入 “communications_categories”(“名称”、“region_id”、“updated_at”、 “created_at”)值(警报,1,2018-06-19 09:38:20,2018-06-19 09:38:20)返回“id”)
当它已经存在时,它似乎正在尝试分配 2 的主键 ID - 但表结构在主键上有一个 nextval,我认为它会采用最后添加的 ID 并在此之后创建一个新 ID。根据关于 Eloquent Inserts here 的 Laravel 文档,没有提到必须自己规定实际的主键 id,可填充元素只有 name 和 region_id。
对此的任何帮助表示赞赏,因为我对 Laravel 和 eloqent 数据库方法相当陌生。如果有帮助,我正在使用 PostgreSQL 数据库。
【问题讨论】:
-
很确定 firstOrCreate 不接受 2 个参数。
$comCats->firstOrCreate(['name' => 'Job Updates', 'region_id' => 1]); -
@Tuim 是的,确实如此。它在文档上。在这种情况下,我的意思是,如果名称“Job Updates”不存在,请将其填充为 region_id 1。您在那里写的内容,检查 Job Updates 是否存在并且 region_id 为 1。
-
我认为您的主键字段不是自动递增的。尝试在您的主键字段中添加自动增量。 chartio.com/resources/tutorials/…
-
请发布
communications_categories迁移(或表结构)。
标签: laravel postgresql eloquent