完整性约束违规firstOrCreate()

时间:2017-05-03 18:24:39

标签: php mysql laravel eloquent laravel-migrations

尝试在模型( ProductItem )上调用 firstOrCreate()两次后出现以下错误,表示具有主键和唯一键的模式:

  

Illuminate \ Database \ QueryException,消息为'SQLSTATE [23000]:   完整性约束违规:1062密钥的重复条目“1000”   'product_items_item_ref_id_unique'(SQL:插入product_items   (item_ref_idnameupdated_atcreated_at)值(1000,   'Item 1',2017-05-03 19:20:26,2017-05-03 19:20:26))'

  1. 首次运行时,我希望 firstOrCreate()会尝试 获取项目,否则如果它不存在,则创建 (插入)并返回一个新的。 < - 它成功插入
  2. 如果我第二次运行 ,我认为它应该返回现有的。 < - 这是发生错误的地方
  3. 迁移如下:

    class CreateProductItemTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('product_items', function (Blueprint $table) {
                $table->increments('id');
                $table->integer('item_ref_id')->unique(); 
                $table->string('name');
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::drop('product_items');
        }
    }
    

    用于创建项目的代码:

    $product_item = App\ProductItem::firstOrCreate(['item_ref_id'=>1000,'name'=>'Item 1')] );
    

    我已经阅读了以下帖子,其中没有一个帮助

    1. laravel first0rNew Integrity Constraint Violation
    2. Laravel 5 Integrity constraint violation
    3. Laravel - Integrity constraint violation: 1062 Duplicate entry

1 个答案:

答案 0 :(得分:0)

我相信你有语法问题。 documentation将语法描述如下:

$flight = App\Flight::firstOrCreate(
    ['name' => 'Flight 10'], ['delayed' => 1]
);

请注意,字段位于不同的数组中,而不是同一数组中的两个元素。试一试。所以对你而言:

$product_item = App\ProductItem::firstOrCreate(['item_ref_id'=>1000], ['name'=>'Item 1')] );