created_at
Поле не импортируется в базу данных. Вместо этого я вижу 1970-01-01 в phpmyadmin
namespace App\Imports;
use App\NewsPost;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class NewsImport implements ToCollection, WithHeadingRow
{
public $rowCount = null;
public function collection(Collection $rows)
{
News::truncate();
foreach ($rows as $row)
{
if( !empty($row['category_id'])) {
NewsPost::create([
'category_id'=> $row['category_id'],
'title' => $row['title'],
'sef' => $row['sef'],
'introtext' => $row['introtext'],
'fulltext' => $row['fulltext'],
'image' => $row['image'],
'metatitle' => $row['metatitle'],
'metakey' => $row['metakey'],
'metadesc' => $row['metadesc'],
'hits' => $row['hits'],
'created_at' => $row['created_at'],
]);
}
}
$this->rowCount = $rows->count();
}
}
namespace App\Admin\Controllers;
use Illuminate\Support\Facades\DB;
use App\Imports\NewsPostImport;
use Maatwebsite\Excel\Facades\Excel;
class SeedController extends BaseAdminController
{
public function index(Content $content)
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Excel::import($newsPost = new NewsPostImport, 'import/news_posts.xlsm');
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
return $content
->title('Import & Export')
->description('Laravel excel')
->withSuccess('Импорт завершен успешно',
'<p>Импортировано '. $newsPost->rowCount.' новостей</p>');
}
}
Заполняется ли created_at на вашей модели?
Да. У меня все поля заполнены
Попробуйте dd () и посмотрите, что там.
Извините за задержку. Я был в отпуске.
Я положил дд сюда
if (empty($row['slug'])) {
News::create([
'category_id' => $row['category_id'],
'title' => $row['title'],
'slug' => Str::slug($row['title'], '-'),
'fulltext' => $row['fulltext'],
'image' => $row['image'],
'metatitle' => $row['metatitle'],
'metakey' => $row['metakey'],
'metadesc' => $row['metadesc'],
'hits' => $row['hits'],
'published_at' => $row['published_at'],
'created_at' => $row['created_at'],
'updated_at' => $row['updated_at'],
'deleted_at' => $row['deleted_at'],
]);
dd($row);
}
и я вижу странный вывод даты на странице
Illuminate\Support\Collection {#1986 ▼
#items: array:14 [▼
"category_id" => 4
.......
"published_at" => null
"created_at" => 41767
]
}
в моем excel у меня есть такое свидание
любая идея?
Я обнаружил проблему.
Я помещаю dd($row)
перед News::create
и проверяю, что получается из Excel.
И я снова увидел 41767.
Затем я перехожу в Excel и проверяю форматирование поля created_at . Это было свидание. Но когда я меняю формат даты на текст, я сразу вижу 41767.
При этом я понял, что перед импортом все даты в excel конвертируются в текст.
Поэтому я вручную преобразовал эти поля в текст, поместил внутрь даты, и теперь он работает.
Только однажды мне удалось успешно выполнить импорт, а затем у меня остались некоторые проблемы, которые я не могу понять.
Импортировать финики - головная боль. Я не вижу правила, которое работает всегда.
Я несколько раз тестировал, как мне сохранять дату в Excel перед импортом, и не вижу стабильного поведения.
Я делаю все поля даты форматом = текст в Excel.
Когда я помещаю дату 08-05-2014
и форматирую как текст.
В любом случае у меня ошибка при импорте
Unexpected data found.
Unexpected data found.
Data missing
http://localhost.test/admin/seed
указывая на \ vendor \ nesbot \ carbon \ src \ Carbon \ Traits \ Creator. php: 623
if (static::isStrictModeEnabled()) {
throw new InvalidArgumentException(implode(PHP_EOL, $lastErrors['errors']));
}
Но когда я делаю dd($row)
я вижу
"created_at" => "08-05-2014"
Что не так?
Кажется, я нашел решение.
Единственный рабочий способ - сохранить дату 2014-05-08
в Excel и отформатировать ее как текст.
Потому что в этом порядке он хранится в MySQL = ГГГГ-ММ-ДД
Ни один из них не работает
08-05-2014 - неправильный заказ
08.05.2014 - неправильный разделитель и неправильный порядок
2014.05.08 - неправильный разделитель
Если поля даты сформированы как дата в Excel, в моем случае дата 2014-05-08 всегда преобразовывалась в 41767 перед импортом. Не знаю почему.
Я попробовал конвертер даты в метку времени, и он дал мне
2014-05-08 = 1399507200.
08-05-2014 = 1407182400
Единственный способ получить 41767 - это попробовать в Excel формулу =text(08.05.2014;0)
Итак, я полагаю, он преобразован в Excel.
И он преобразуется, даже если я настрою поле даты на формат ГГГГ-ММ-ДД.
Таким образом, единственным рабочим решением является текстовый формат с текстом YYYY-MM-DD внутри.
Поправьте меня, если это решение не совсем верное.
У меня такая же проблема. Поля 'date' возвращают число (ссылка, я думаю?), А не значение.
Чтобы получить Carbon, если столбец даты отформатирован как дата: Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))
Работает для непустых полей. Но когда скрипт импорта достигает пустого поля, он останавливается со следующей ошибкой.
Эта проблема появляется только в Laravel 7. С Laravel 6 у меня этой проблемы нет.
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '1970-01-01 00:00:00' for column 'published_at' at row 1 (SQL: insert into `news_posts` (`category_id`, `title`, `slug`, `fulltext`, `image`, `metatitle`, `metakey`, `metadesc`, `hits`, `is_published`, `published_at`, `created_at`, `updated_at`, `deleted_at`) values ...
Что делать?
Предложение IF невозможно внутри импорта
if (empty($row['published_at'])) {
'published_at' => $row['published_at'],
} else {
'published_at' => Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['published_at'])),
}
Выдает ошибку syntax error, unexpected 'if' (T_IF), expecting ']'
Поместите его во временную переменную
что вы имеете в виду под «временной переменной»?
Я нашел приемлемое решение
foreach ($rows as $row)
{
if (!empty($row['category_id'])) {
$slug = empty($row['slug']) ? Str::slug($row['title'], '-') : $row['slug'];
$published_at = empty($row['published_at']) ? $row['published_at'] : Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['published_at']));
$created_at = empty($row['created_at']) ? $row['created_at'] : Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['created_at']));
$updated_at = empty($row['updated_at']) ? $row['updated_at'] : Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['updated_at']));
$deleted_at = empty($row['deleted_at']) ? $row['deleted_at'] : Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['deleted_at']));
NewsPost::create([
'category_id' => $row['category_id'],
'title' => $row['title'],
'slug' => $slug,
'fulltext' => $row['fulltext'],
'image' => $row['image'],
'metatitle' => $row['metatitle'],
'metakey' => $row['metakey'],
'metadesc' => $row['metadesc'],
'hits' => $row['hits'],
'is_published' => $row['is_published'],
'published_at' => $published_at,
'created_at' => $created_at,
'updated_at' => $updated_at,
'deleted_at' => $deleted_at,
]);
}
}
Самый полезный комментарий
Чтобы получить Carbon, если столбец даты отформатирован как дата:
Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))