Laravel-excel: Bidang tanggal [BUG] tidak diimpor

Dibuat pada 10 Mar 2020  ·  14Komentar  ·  Sumber: Maatwebsite/Laravel-Excel

Prasyarat

  • [Х] Memeriksa apakah versi Laravel Excel Anda masih didukung: https://docs.laravel-excel.com/3.1/getting-started/support.html#supported -versions
  • [Х] Mampu mereproduksi perilaku di luar kode Anda, masalahnya diisolasi ke Laravel Excel.
  • [Х] Memeriksa bahwa masalah Anda belum diajukan.
  • [Х] Diperiksa apakah tidak ada PR yang dikirimkan yang memperbaiki masalah ini.
  • [Х] Berisi di seluruh template masalah

Versi

  • Versi PHP: 7.2.19
  • Versi Laravel: 6.17.1
  • Versi paket: 3.1.0

Deskripsi

created_at field tidak diimpor ke database. Sebaliknya saya melihat 1970-01-01 di phpmyadmin

Langkah-langkah untuk Mereproduksi

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>');
    }

}
bug

Komentar yang paling membantu

Untuk mendapatkan Karbon ketika kolom tanggal diformat sebagai tanggal: Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))

Semua 14 komentar

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
date

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,
              ]);             

          }

        }
Apakah halaman ini membantu?
0 / 5 - 0 peringkat