Почему метод Model::updateOrCreate не учитывает второй элемент массива в первом параметре?

У вас возникла ошибка при выполнении следующего кода: 

<pre><code>Model::updateOrCreate(['amoID' =&gt; 43222233, 'crmCompanyID'=&gt;1]);</code></pre>

Ошибка следующая: 

<blockquote>
Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1364 Field 'crmCompanyID' doesn't have a default value (SQL: insert into `Model` (`amoID`, `updated`, `created`) values (43222233, 2025-01-05 20:41:11, 2025-01-05 20:41:11))
</blockquote>

Согласно сообщению об ошибке, поле 'crmCompanyID' не имеет значения по умолчанию. При этом в базе данных существует уникальный ключ, состоящий из полей (amoID, crmCompanyID). Каковы возможные причины этой проблемы и как её можно исправить?
  • 5 января 2025 г. 18:53
Ответы на вопрос 2
Ошибку, которую вы видите, можно объяснить тем, что метод `updateOrCreate` в Laravel требует два параметра:

1. Массив условий для поиска существующей записи.
2. Массив значений, которые необходимо установить или обновить.

Ваш код:

```php
Model::updateOrCreate(['amoID' => 43222233, 'crmCompanyID' => 1]);
```

вызовет ошибку, потому что вы не указали второй массив, содержащий значения для обновления или создания записи.

Ваша ошибка заключается в том, что метод не может найти запись, соответствующую условиям, и попытается создать новую запись с указанными значениями. Однако так как вы не указали значение для поля `crmCompanyID`, возникает ошибка.

Чтобы исправить это, вам нужно дополнить вызов метода:

```php
Model::updateOrCreate(
    ['amoID' => 43222233, 'crmCompanyID' => 1], // Условия для поиска
    ['crmCompanyID' => 1] // Значения для создания/обновления
);
```

Этот код будет работать так:
- Если существует запись с `amoID` равным `43222233` и `crmCompanyID` равным `1`, будет обновлена запись.
- Если такой записи не существует, будет создана новая запись с обоими полями.

Таким образом, важно помнить, что второй параметр `updateOrCreate` должен содержать значения для всех полей, которые являются обязательными и не имеют значений по умолчанию.
Метод updateOrCreate() работает следующим образом: 


В вашем коде отсутствует указание поля crmCompanyID в параметрах для создания записи. Следовательно, Laravel пытается вставить NULL (или пропускает поле), что вызывает ошибку, так как это поле не допускает NULL и не имеет значения по умолчанию.
Model::updateOrCreate(
    ['amoID' => 43222233], // Условия для поиска
    ['crmCompanyID' => 1, 'updated' => now(), 'created' => now()] // Данные для обновления или создания
);
Похожие вопросы