#php #laravel
#php #laravel
Вопрос:
Я пытаюсь выполнить команду laravel 5.4 для импорта данных из Excel. Я смог собрать все данные, и теперь я пытаюсь вставить в базу данных, но я получаю странную ошибку.
Это фрагмент кода, в котором возникает ошибка:
$data = [
'name' => $row['name'],
'address' => $row['address'],
'suite' => $row['suite'],
'city' => $row['city'],
'zipcode' => $row['zipcode'],
'country_code' => $row['country_code'],
'province_code' => $row['province_code'],
'region_id' => $region_id,
'phone' => $row['phone'],
'fax' => $row['fax'],
'website' => $row['website'],
'linkedin' => $row['linkedin'],
'facebook' => $row['facebook'],
'twitter' => $row['twitter'],
'number_employees' => $row['number_employees'],
'year_creation' => $row['year_creation'],
'turnover_id' => $turnover_id,
'status' => 1,
'hidden_directory' => 0,
'hidden_directory_byadmin' => 0,
'is_member' => $row['is_member'],
'created_by' => 1,
];
$company = Company::create($data);
И это ошибка:
Array to string conversion (SQL: insert into `company` (`name`, `address`, `suite`, `city`, `zipcode`, `country_code`, `province_code`, `region_id`, `phone`, `fax`, `website`, `lin
kedin`, `facebook`, `twitter`, `number_employees`, `year_creation`, `turnover_id`, `status`, `hidden_directory`, `created_by`, `updated_at`, `created_at`) values (Test Company 3, 1
315 Rue St-Louis, , Montreal, H4L 2P4, CA, QC, , 1 (438) 999-555, 1 (438) 999-555, http://www.google.com, https://www.linkedin.com/feed/, https://www.facebook.com/, https://twitt
er.com/, 200, 2010, , 1, 0, 1, 2019-03-27 09:48:29, 2019-03-27 09:48:29))
Похоже, что в запросе SQL insert отсутствуют галочки. Странно то, что я делаю ту же вставку в других частях системы, где этого не происходит.
Я не пытаюсь вставить здесь JSON. Да, я видел все похожие вопросы здесь, в StackOverflow, и это часто случается, когда вы пытаетесь вставить json, но не обычные строки и целые числа.
Что я, возможно, делаю здесь неправильно?
Спасибо за любую помощь.
Комментарии:
1. Возможно ли, что один из индексов
$row
, like$row["example"]
является массивом, а не строкой / int? Сделайтеdd($data)
и посмотрите, что это такое, прежде чем пытаться вставить. Или, может быть,$region_id
или$turnover_id
это массив; как они определяются?2. @TimLewis гениален. Именно так. Пожалуйста, отправьте ответ, чтобы я мог установить его как правильный.
3. Будет сделано, всего одну секунду.
Ответ №1:
По сути, индекс в $row
является array
, а не string
или an int
, как ожидается, для insert. Поскольку это может быть любой индекс, лучше попытаться избежать этой ошибки, используя try/catch
блок с DB::transaction()
логикой:
DB::beingTransaction();
try {
$data = [
'name' => $row['name'],
'address' => $row['address'],
'suite' => $row['suite'],
'city' => $row['city'],
'zipcode' => $row['zipcode'],
'country_code' => $row['country_code'],
'province_code' => $row['province_code'],
'region_id' => $region_id,
'phone' => $row['phone'],
'fax' => $row['fax'],
'website' => $row['website'],
'linkedin' => $row['linkedin'],
'facebook' => $row['facebook'],
'twitter' => $row['twitter'],
'number_employees' => $row['number_employees'],
'year_creation' => $row['year_creation'],
'turnover_id' => $turnover_id,
'status' => 1,
'hidden_directory' => 0,
'hidden_directory_byadmin' => 0,
'is_member' => $row['is_member'],
'created_by' => 1,
];
$company = Company::create($data);
DB::commit();
} catch(Exception $ex){
Log::error("Error in Company::create(): ".$ex->getMessage());
DB::rollBack();
}
Если вы не уверены в том, что $row[...]
может содержать, и существует вероятность array
/ в противном случае недопустимого значения, использование try/catch
подобного этого предотвратит проблемы с вставкой и завершит вставку только тогда, когда ошибок не возникнет. Помимо этого, вы должны убедиться, что вставляемые данные соответствуют вашим ожиданиям.
Ответ №2:
вы можете выполнить преобразование стиля строки следующим образом
$data = [
'name' => (string)$row['name'],
'address' => (string)$row['address'],
'suite' => (string)$row['suite'],
'city' => (string)$row['city'],
'zipcode' => (string)$row['zipcode'],
'country_code' => (string)$row['country_code'],
'province_code' => (string)$row['province_code'],
'region_id' => $region_id,
'phone' => (string)$row['phone'],
'fax' => (string)$row['fax'],
'website' => (string)$row['website'],
'linkedin' => (string)$row['linkedin'],
'facebook' => (string)$row['facebook'],
'twitter' => (string)$row['twitter'],
'number_employees' => (string)$row['number_employees'],
'year_creation' => (string)$row['year_creation'],
'turnover_id' => $turnover_id,
'status' => 1,
'hidden_directory' => 0,
'hidden_directory_byadmin' => 0,
'is_member' => (bool)$row['is_member'],
'created_by' => 1,
];
$company = Company::create($data);
Или вместо строки вы можете использовать int / float. Это сохранит ваши данные в строковом формате.