Нарушение ограничения целостности firstOrCreate ()

Я получаю следующую ошибку после попытки дважды вызвать firstOrCreate () в модели (ProductItem), представляющей схему с первичным ключом И уникальным ключом:

Illuminate \ Database \ QueryException с сообщением 'SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись' 1000 'для ключа' product_items_item_ref_id_unique '(SQL: вставить в значения product_items (item_ref_id, name, updated_at, created_at) (1000,' Элемент 1 ', 2017-05-03 19:20:26, 2017-05-03 19:20:26))'

  1. При первом запуске я ожидал, что firstOrCreate () попытается получить элемент, в противном случае, если он не существует, он создает (вставляет) и возвращает новый. . ‹- вставляется успешно
  2. Если я запустил его второй раз, я предполагаю, что он должен вернуть существующий. ‹- здесь возникает ошибка

Перенос происходит следующим образом:

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 first0rНовое нарушение ограничения целостности
  2. Нарушение ограничения целостности Laravel 5
  3. Laravel - Нарушение ограничения целостности: 1062 Повторяющаяся запись

person user919426    schedule 03.05.2017    source источник
comment
Что произойдет, если вы удалите уникальное ограничение из item_ref_id?   -  person    schedule 03.05.2017
comment
firstOrCreate выходит из поля id. ЕСЛИ вы хотите, чтобы item_ref_id был вашим первичным ключом, определите его как первичный с указанным значением и удалите столбец приращений. Если вы хотите, чтобы item_ref_id был столбцом автоинкремента, измените идентификатор приращения и убедитесь, что в вашей модели установлен primaryKey.   -  person aynber    schedule 03.05.2017
comment
@aynber Я хочу, чтобы item_ref_id был уникальным ключом, а не первичным, а id был первичным ключом.   -  person user919426    schedule 03.05.2017
comment
Из любопытства, что произойдет, если вы удалите 'name' => 'Item1' и оставите только идентификатор ссылки в качестве параметра поиска?   -  person Naltroc    schedule 03.05.2017


Ответы (1)


Я считаю, что у вас проблема с синтаксисом. В документации синтаксис описывается следующим образом:

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

Обратите внимание, что поля находятся в разных массивах, а не в двух элементах одного массива. Дайте ему шанс. Так что для вас это будет:

$product_item = App\ProductItem::firstOrCreate(['item_ref_id'=>1000], ['name'=>'Item 1')] );
person Arty    schedule 03.05.2017
comment
Возможно, ваш синтаксис также должен работать, поскольку я заметил, что в документации он используется в примере updateOrCreate (). В этом случае возникает другая проблема. - person Arty; 03.05.2017