Я ищу запись, которая соответствует условию `['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`, который оказывается равным нулю.
Ошибка "Нарушение целостности данных: Столбец '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 .