Как можно исправить ошибку "Нарушение целостности данных: Столбец 'crmCompanyID' не может быть пустым"?

Я ищу запись, которая соответствует условию `['amoID' => $contacts[0]->getId(), 'crmCompanyID' => $companyID]`. В случае, если такой записи не существует, необходимо создать новую. Однако возникает ошибка, указывающая на то, что `crmCompanyID` не может иметь значение ноль. 

Вот структура моей базы данных: 
<pre><code>CREATE TABLE IF NOT EXISTS `crmAmoUser` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `amoID` bigint(20) UNSIGNED NOT NULL COMMENT 'Ид в амо',
  `name` varchar(190) NOT NULL COMMENT 'Имя',
  `crmCompanyID` int(11) NOT NULL,
  `created` timestamp NULL DEFAULT NULL,
  `updated` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `AMOID` (`amoID`,`crmCompanyID`) USING BTREE,
  KEY `CRMAmoUserCompany` (`crmCompanyID`) USING BTREE,
  KEY `CRMNameCompany` (`name`,`crmCompanyID`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8</code></pre> 

Также вот определение модели:
<pre><code>class AmoUser extends BaseCRM
{
    protected $table = 'crmAmoUser';

    protected $casts = [
        'created' => 'datetime',
        'updated' => 'datetime',
        'name' => 'string',
        'amoID' => 'int',
        'crmCompanyID' => 'int',
    ];

    protected $fillable = [
        'name',
        'amoID',
        'crmCompanyID'
    ];

    public function Company(){
        return $this->belongsTo(Company::class, 'crmCompanyID');
    }
}</code></pre> 

И вот часть кода, где инициализируется интеграция:
<pre><code>$amoCRMIntegration = new AmoCRMIntegration($company->id);
$amoCRMIntegration->getLeadsWithContacts($all);</code></pre> 

Прошу помочь разобраться с проблемой, возникающей при создании записи с `crmCompanyID`, который оказывается равным нулю.
  • 9 января 2025 г. 9:43
Ответы на вопрос 2
Ошибка "Нарушение целостности данных: Столбец 'crmCompanyID' не может быть пустым" указывает на то, что вы пытаетесь создать запись в таблице `crmAmoUser`, где значение `crmCompanyID` равно нулю или не задано, что противоречит объявленной ограниченности (NOT NULL) для этого столбца в структуре базы данных.

Вот несколько шагов, которые могут помочь вам устранить эту проблему:

1. **Проверка существования значения `crmCompanyID`:**
   Убедитесь, что перед созданием новой записи переменная `$companyID` (или аналогичная, которая используется для назначения `crmCompanyID`) содержит корректное значение, отличное от нуля. Например:

   ```php
   if (!$companyID) {
       // Обработка случая, когда crmCompanyID отсутствует
       throw new Exception("crmCompanyID не может быть пустым");
   }
   ```

2. **Проверка существующей записи:**
   Если вы ищете существующую запись для обновления или создания, убедитесь, что запрос для нахождения записи корректный и фактически возвращает запись, если она существует:

   ```php
   $user = AmoUser::where([
       'amoID' => $contacts[0]->getId(),
       'crmCompanyID' => $companyID
   ])->first();
   ```

   Если запись не найдена, создайте её только если `crmCompanyID` имеет допустимое значение. Например:

   ```php
   if (!$user) {
       // Создаем новую запись только если $companyID не ноль
       if ($companyID) {
           $user = AmoUser::create([
               'name' => 'Имя пользователя', // Замените на свое значение
               'amoID' => $contacts[0]->getId(),
               'crmCompanyID' => $companyID,
           ]);
       } else {
           throw new Exception("Невозможно создать новую запись: crmCompanyID не может быть пустым.");
       }
   }
   ```

3. **Проверка на уровне базы данных:**
   Если обновление записи необходимо, проверьте схему базы данных, чтобы убедиться, что все ограничения установлены правильно. Все связи и ограничения должны поддерживать вашу бизнес-логику.

4. **Логирование и тестирование:**
   Добавьте логирование перед выполнением операций создания и обновления, чтобы удостовериться в том, какие значения поступают в ваш код. Это поможет найти источники проблемы.

   Например:

   ```php
   Log::info('Создание пользователя', [
       'amoID' => $contacts[0]->getId(),
       'crmCompanyID' => $companyID,
   ]);
   ```

5. **Разработка тестов:**
   Если у вас есть возможность, создайте тесты для проверки сценариев, которые вы используете. Это поможет выявить потенциальные проблемы до их возникновения.

Следуя данным рекомендациям, вы сможете устранить проблему с попытками создания записи с `crmCompanyID`, равным нулю.
Посмотри стек вызовов в логах. После вызова каких функций происходит твоя ошибка. Ошибка не здесь «$ amoContact Entity->crmCompanyID=(int)$companyID;», т.к. тут работа происходит с AmoContact , а в сообщение об ошибке фигурирует crmAmoUser .
Похожие вопросы