created_at
field tidak diimpor ke database. Sebaliknya saya melihat 1970-01-01 di 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>');
}
}
Apakah create_at dapat diisi pada model Anda?
Iya. Saya memiliki semua bidang yang bisa diisi
Coba dd () dan lihat apa yang ada di sana.
maaf atas keterlambatan. Saya sedang liburan.
Saya taruh dd di sini
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);
}
dan saya melihat keluaran tanggal yang aneh di halaman
Illuminate\Support\Collection {#1986 ▼
#items: array:14 [▼
"category_id" => 4
.......
"published_at" => null
"created_at" => 41767
]
}
di excel saya, saya memiliki kencan seperti itu
ada ide?
Saya menemukan masalah.
Saya meletakkan dd($row)
sebelum News::create
dan memeriksa apa yang berasal dari excel.
Dan saya melihat 41767 lagi.
Lalu saya pergi ke excel dan memeriksa pemformatan bidang create_at . Itu adalah kencan. Tetapi ketika saya mengubah format dari tanggal ke teks secara langsung, saya melihat 41767.
Melakukan itu saya mengerti bahwa sebelum mengimpor semua tanggal di excel diubah menjadi teks.
Jadi saya mengonversi bidang ini menjadi teks secara manual, memasukkan tanggal di dalamnya dan berfungsi sekarang.
Hanya sekali saya berhasil mengimpor dan kemudian saya masih memiliki beberapa masalah, yang tidak dapat saya pahami.
Mengimpor kurma memang memusingkan. Saya tidak bisa melihat aturan, yang selalu berhasil.
Saya menguji beberapa kali bagaimana saya harus menyimpan tanggal di Excel sebelum mengimpor dan saya melihat perilaku tidak stabil.
Saya membuat semua bidang tanggal format = teks di excel.
Ketika saya menuliskan tanggal 08-05-2014
dan format sebagai teks.
Pokoknya saya mengalami kesalahan saat mengimpor
Unexpected data found.
Unexpected data found.
Data missing
http://localhost.test/admin/seed
menunjuk ke \ vendor \ nesbot \ carbon \ src \ Carbon \ Traits \ Creator. php: 623
if (static::isStrictModeEnabled()) {
throw new InvalidArgumentException(implode(PHP_EOL, $lastErrors['errors']));
}
Tapi ketika saya melakukan dd($row)
saya mengerti
"created_at" => "08-05-2014"
Apa yang salah?
Sepertinya saya menemukan solusi.
Satu-satunya cara kerja adalah menyimpan tanggal 2014-05-08
di Excel dan memformat sebagai teks.
Karena dalam urutan ini disimpan di MySQL = YYYY-MM-DD
Semua ini tidak berfungsi
08-05-2014 - urutan salah
08.05.2014 - pembatas salah dan urutan salah
2014.05.08 - pembatas salah
Jika bidang tanggal diformat sebagai tanggal di Excel dalam kasus saya, tanggal 2014-05-08 selalu diubah menjadi 41767 sebelum diimpor. Saya tidak tahu kenapa.
Saya mencoba konverter tanggal ke stempel waktu dan itu memberi saya
2014-05-08 = 1399507200.
08-05-2014 = 1407182400
Satu-satunya cara saya bisa mendapatkan 41767 adalah ketika saya mencoba rumus Excel =text(08.05.2014;0)
Jadi saya kira itu diubah oleh Excel.
Dan itu diubah bahkan jika saya menyesuaikan bidang tanggal ke format YYYY-MM-DD.
Jadi hanya solusi yang berfungsi adalah format teks dengan teks YYYY-MM-DD di dalamnya.
Koreksi saya jika solusi ini tidak sepenuhnya tepat.
Saya mengalami masalah yang sama. Bidang 'tanggal' mengembalikan angka (referensi, saya kira?) Dan bukan nilainya.
Untuk mendapatkan Karbon ketika kolom tanggal diformat sebagai tanggal: Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))
Ini berfungsi untuk bidang yang tidak kosong. Tetapi ketika skrip impor mencapai bidang kosong itu berhenti dengan kesalahan berikut.
Masalah ini hanya muncul di Laravel 7. Dengan Laravel 6 saya tidak memiliki masalah ini.
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 ...
Apa yang harus dilakukan?
JIKA klausa tidak dimungkinkan di dalam impor
if (empty($row['published_at'])) {
'published_at' => $row['published_at'],
} else {
'published_at' => Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['published_at'])),
}
Ini memberikan kesalahan syntax error, unexpected 'if' (T_IF), expecting ']'
Masukkan ke dalam variabel sementara
apa yang Anda maksud dengan "variabel sementara"?
Saya menemukan solusi yang dapat diterima
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,
]);
}
}
Komentar yang paling membantu
Untuk mendapatkan Karbon ketika kolom tanggal diformat sebagai tanggal:
Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))