如何使用自定义自动增量主键Laravel添加模型

时间:2018-02-20 08:47:34

标签: php laravel postgresql orm eloquent

我正在创建一个播种机,它将我们的生产数据库(的一部分)数据读入我们的临时环境。

所以我得到了一个名为“类别”的模型,它的主键设置如下:

// 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

3 个答案:

答案 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。