Laravel-excel: لم يتم استيراد حقل التاريخ [BUG]

تم إنشاؤها على ١٠ مارس ٢٠٢٠  ·  14تعليقات  ·  مصدر: Maatwebsite/Laravel-Excel

المتطلبات الأساسية

  • [Х] تم التحقق مما إذا كان إصدار Laravel Excel الخاص بك لا يزال مدعومًا: https://docs.laravel-excel.com/3.1/getting-started/support.html#supported -versions
  • [Х] قادر على إعادة إنتاج السلوك خارج التعليمات البرمجية الخاصة بك ، المشكلة معزولة في Laravel Excel.
  • [Х] تم التحقق من عدم تقديم مشكلتك بالفعل.
  • [Х] تم الفحص إذا لم يتم تقديم العلاقات العامة التي تعمل على حل هذه المشكلة.
  • [Х] معبأ في نموذج العدد بأكمله

إصدارات

  • إصدار PHP: 7.2.19
  • إصدار Laravel: 6.17.1
  • إصدار الحزمة: 3.1.1

وصف

لم يتم استيراد الحقل 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>');
    }

}
bug

التعليق الأكثر فائدة

للحصول على الكربون عند تنسيق عمود التاريخ كتاريخ: Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))

ال 14 كومينتر

هل تم إنشاؤه في نموذجك؟

نعم. لدي كل الحقول القابلة للتعبئة

حاول dd () وشاهد ما يوجد هناك.

آسف على التأخير. كنت في اجازة.
أضع 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
  ]
}

في التفوق لدي تاريخ من هذا القبيل
date

اي فكرة؟

لقد وجدت مشكلة.
أضع dd($row) قبل News::create وتحقق مما يأتي من Excel.
ورأيت 41767 مرة أخرى.
ثم أذهب إلى التفوق والتحقق من تنسيق الحقل created_at . كان التاريخ. ولكن عندما أقوم بتغيير التنسيق من تاريخ إلى نص بشكل مذهل ، أرى 41767.
عند القيام بذلك ، فهمت أنه قبل الاستيراد ، يتم تحويل جميع التواريخ في Excel إلى نص.
لذلك قمت بتحويل هذه الحقول إلى نص يدويًا ، ووضعت التواريخ في الداخل وهي تعمل الآن.

مرة واحدة فقط تمكنت من القيام بالاستيراد بنجاح وبعد ذلك ما زلت أواجه بعض المشكلات التي لا أستطيع فهمها.
من الصداع استيراد التمور. لا استطيع ان ارى القاعدة التي تعمل دائما.

لقد اختبرت عدة مرات كيف يجب أن أحافظ على التاريخ في Excel قبل الاستيراد ولا أرى سلوكًا ثابتًا.

أقوم بعمل تنسيق جميع حقول التاريخ = نص في Excel.
عندما أضع التاريخ 08-05-2014 والتنسيق كنص.
على أي حال لدي خطأ أثناء الاستيراد

Unexpected data found.
 Unexpected data found.
 Data missing
http://localhost.test/admin/seed

يشير إلى \ البائع \ nesbot \ carbon \ src \ Carbon \ Traits \ Creator. فب: 623

        if (static::isStrictModeEnabled()) {
            throw new InvalidArgumentException(implode(PHP_EOL, $lastErrors['errors']));
        }

ولكن عندما أفعل ذلك dd($row) أرى

 "created_at" => "08-05-2014"

ما الخطأ؟

يبدو أنني وجدت الحل.
طريقة العمل الوحيدة هي الاحتفاظ بالتاريخ 2014-05-08 في Excel والتنسيق كنص.
لأنه يتم تخزينه بهذا الترتيب في MySQL = YYYY-MM-DD
أي من هؤلاء لا يعمل
08201- أمر خاطئ
08.05.2014 - محدد خاطئ وترتيب خاطئ
2014.05.08 - محدد خاطئ

إذا تم تنسيق حقول التاريخ كتاريخ في Excel في حالتي ، فإن تاريخ 2014/05/08 تم تحويله دائمًا إلى 41767 قبل الاستيراد. لا اعرف لماذا.
لقد جربت تحويل التاريخ إلى طابع زمني وهذا يعطيني
2014/05/08 = 1399507200.
08-2018 = 1407182400

الطريقة الوحيدة التي يمكنني بها الحصول على 41767 هي عندما حاولت استخدام صيغة Excel =text(08.05.2014;0)
لذلك أفترض أنه تم تحويله بواسطة Excel.
ويتم تحويله حتى إذا قمت بضبط حقل التاريخ إلى تنسيق YYYY-MM-DD.

لذا فإن الحل العامل الوحيد هو تنسيق النص بداخله نص YYYY-MM-DD.
صححني إذا لم يكن هذا الحل صحيحًا تمامًا.

لدي نفس المشكلة. تُرجع حقول "التاريخ" رقمًا (المرجع ، أعتقد؟) وليس القيمة.

للحصول على الكربون عند تنسيق عمود التاريخ كتاريخ: 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,
              ]);             

          }

        }
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات