【发布时间】:2018-07-30 13:35:58
【问题描述】:
我正在创建一个播种机,它将生产数据库中的数据(一部分)读取到我们的暂存环境中。
所以我得到了一个名为“类别”的模型,它的主键设置如下:
Table "public.categories"
Column | Type | Modifiers |
-----------------+--------------------------------+---------------------------------------------------------+
id | integer | not null default nextval('categories_id_seq'::regclass) |
因为我从我的产品数据库中选择了几个类别,所以它的 id 不是连续的(它们看起来像这样:)
id
-----
3
9
7
1
11
13
15
19
21
23
25
43
45
49
51
53
55
57
61
现在我还有一个自定义播种器文件,我想在其中创建虚假类别。自然,我必须确保创建的类别的 ID 大于具有最高 ID 的类别。我是这样做的:
$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();
但我不断收到此错误:
[Illuminate\Database\QueryException] SQLSTATE[23505]:唯一 违规:7 错误:重复键值违反唯一约束 “categories_pkey”详细信息:密钥 (id)=(13) 已存在。 (SQL: 插入“类别”(“ref_translation”,“ref”,“parent_id”, “top_parent_id”、“图像”、“优先级”、“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 语句相同,但效果很好:
insert into categories (id, ref_translation,ref,image,priority) values (200, 'translatable.category.ref.ZAxcHj4hOziemQyz', 'LP2a1bY81IGSza0eHVSqdfsdfdsffds', 'image_name', 1);
INSERT 0 1
如何通过 Laravel 的 Eloquent ORM 实现这一点?
更新
作为参考,这是我的类生成器的样子:
$factory->define(App\Category::class, function (Faker\Generator $faker) {
$category = App\Category::create([
'ref' => str_random(20),
'image' => $faker->imageUrl(300, 300),
'priority' => rand(0, 100),
]);
$top_parent_id = $category->id;
return [
'ref' => str_random(21),
'parent_id' => $top_parent_id,
'top_parent_id' => $top_parent_id,
'image' => $faker->imageUrl(300, 300),
'priority' => rand(0, 100),
];
});
【问题讨论】:
-
你尝试更新 Laravel 了吗?
标签: php laravel postgresql orm eloquent