我正在创建一个播种机,它将我们的生产数据库(的一部分)数据读入我们的临时环境。
所以我得到了一个名为“类别”的模型,它的主键设置如下:
// main.c
#include <stdlib.h>
#include "foo"
#include "bar"
int main() {
foo();
bar();
return EXIT_SUCCESS;
}
因为我从我的prod db中选择了几个类别,所以它的id不是顺序的(它们看起来像这样:)
Table "public.categories"
Column | Type | Modifiers |
-----------------+--------------------------------+---------------------------------------------------------+
id | integer | not null default nextval('categories_id_seq'::regclass) |
现在我还有一个自定义播种器文件,我想创建假类别。当然,我必须确保我正在创建一个ID大于id最高类别的类别。我这样做是这样的:
id
-----
3
9
7
1
11
13
15
19
21
23
25
43
45
49
51
53
55
57
61
但我继续犯这个错误:
[Illuminate \ Database \ QueryException] SQLSTATE [23505]:唯一 违规:7错误:重复键值违反唯一约束 “categories_pkey”DETAIL:Key(id)=(13)已经存在。 (SQL: 插入“类别”(“ref_translation”,“ref”,“parent_id”, “top_parent_id”,“image”,“priority”,“updated_at”,“created_at”) 值(translatable.category.ref.HDHCDuNPC4vZoHBB,三明治,124, 124,https://cdn.filepicker.io/api/file/TqB5OvCdSxGDFecrSyrU,0, 2018-02-20 08:38:20,2018-02-20 08:38:20)返回“id”)
[Doctrine \ DBAL \ Driver \ PDOException] SQLSTATE [23505]:唯一 违规:7错误:重复键值违反唯一约束 “categories_pkey”DETAIL:Key(id)=(13)已经存在。
尽管与原始postgresql语句相同,但工作正常:
$factory->define(App\Category::class, function (Faker\Generator $faker) {
// to avoid duplicating ids
$lastCategory = Category::select('id')->orderBy('id','desc')->first();
$category = new Category();
$category->id = $lastCategory->id+1;
$category->ref = str_random(20);
$category->image = $faker->imageUrl(300, 300);
$category->priority = rand(0, 100);
$category->save();
如何通过Laravel的Eloquent ORM实现这一目标?
供参考,这是我的类生成器的样子:
insert into categories (id, ref_translation,ref,image,priority) values (200, 'translatable.category.ref.ZAxcHj4hOziemQyz', 'LP2a1bY81IGSza0eHVSqdfsdfdsffds', 'image_name', 1);
INSERT 0 1
答案 0 :(得分:1)
这使它起作用
$lastCategory = \App\Category::orderBy('id','desc')->first();
\DB::statement('alter sequence categories_id_seq restart with '.(intval($lastCategory->id)+1));
答案 1 :(得分:0)
由于某种原因,它似乎正在插入id = 13的新记录
// this is another way, however you need a PDO object for it
$lastId = DB::getPdo()->lastInsertId();
尝试删除:
// ->id because the $lastCategory contains the last integer
$category->id = ((int)$lastCategory +1);
答案 2 :(得分:0)
在定义列本身时,在Model中使用Laravel的increments()
方法。
检查doc here。这将负责增加新插入的ID。
此方法的变体也适用于int,bigint和tinyint。