created_at
Feld
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>');
}
}
Ist created_at auf Ihrem Modell ausfüllbar?
Ja. Ich habe alle Felder ausfüllbar
Versuchen Sie, dd () und sehen Sie, was dort drin ist.
Entschuldigung für die Verspätung. Ich war in Urlaub.
Ich habe dd hier gesetzt
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);
}
und ich sehe seltsame Datumsausgabe auf der Seite
Illuminate\Support\Collection {#1986 ▼
#items: array:14 [▼
"category_id" => 4
.......
"published_at" => null
"created_at" => 41767
]
}
In meinem Excel habe ich so ein Date
irgendeine Idee?
Ich habe ein Problem gefunden.
Ich setze dd($row)
vor News::create
und überprüfe, was von Excel kommt.
Und ich sah 41767 wieder.
Dann gehe ich zu Excel und überprüfe die Formatierung des Feldes created_at . Es war Datum. Aber wenn ich das Format sofort von Datum zu Text ändere, sehe ich 41767.
Dabei habe ich verstanden, dass vor dem Import alle Daten in Excel in Text konvertiert werden.
Also habe ich diese Felder manuell in Text konvertiert, Datumsangaben eingegeben und es funktioniert jetzt.
Nur einmal konnte ich erfolgreich importieren und dann habe ich immer noch einige Probleme, die ich nicht verstehen kann.
Das Importieren von Daten bereitet Kopfschmerzen. Ich kann keine Regel sehen, die immer funktioniert.
Ich habe einige Male getestet, wie ich das Datum vor dem Import in Excel halten soll, und sehe kein stabiles Verhalten.
Ich mache alle Datumsfelder Format = Text in Excel.
Wenn ich das Datum 08-05-2014
und als Text formatiere.
Jedenfalls habe ich beim Import einen Fehler
Unexpected data found.
Unexpected data found.
Data missing
http://localhost.test/admin/seed
Zeigen auf \ vendor \ nesbot \ carbon \ src \ Carbon \ Traits \ Creator. PHP: 623
if (static::isStrictModeEnabled()) {
throw new InvalidArgumentException(implode(PHP_EOL, $lastErrors['errors']));
}
Aber wenn ich dd($row)
mache, sehe ich
"created_at" => "08-05-2014"
Was ist falsch?
Scheint, als hätte ich eine Lösung gefunden.
Die einzige Möglichkeit besteht darin, das Datum 2014-05-08
in Excel beizubehalten und als Text zu formatieren.
Weil es in dieser Reihenfolge in MySQL = JJJJ-MM-TT gespeichert ist
All dies funktioniert nicht
08-05-2014 - falsche Reihenfolge
08.05.2014 - falsches Trennzeichen und falsche Reihenfolge
2014.05.08 - falsches Trennzeichen
Wenn Datumsfelder in meinem Fall als Datum in Excel formatiert wurden, wurde das Datum 2014-05-08 vor dem Import immer in 41767 konvertiert. Ich weiß nicht warum.
Ich habe versucht, Datum zu Zeitstempel Konverter und es gibt mir
08.05.2014 = 1399507200.
08-05-2014 = 1407182400
Der einzige Weg, wie ich 41767 bekommen konnte, war, als ich es in der Excel-Formel =text(08.05.2014;0)
versuchte
Ich nehme an, es wird von Excel konvertiert.
Und es wird konvertiert, auch wenn ich das Datumsfeld auf das Format JJJJ-MM-TT anpasse.
Die einzige funktionierende Lösung ist das Textformat mit JJJJ-MM-TT-Text.
Korrigieren Sie mich, wenn diese Lösung nicht ganz richtig ist.
Ich habe das gleiche Problem. Die 'Datums'-Felder geben eine Zahl zurück (eine Referenz, denke ich?) Und nicht den Wert.
So erhalten Sie Carbon, wenn die Datumsspalte als Datum formatiert ist: Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))
Es funktioniert für nicht leere Felder. Wenn das Importskript jedoch ein leeres Feld erreicht, wird es mit dem folgenden Fehler beendet.
Dieses Problem tritt nur in Laravel 7 auf. Mit Laravel 6 habe ich dieses Problem nicht.
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 ...
Was zu tun ist?
IF-Klausel ist beim Import nicht möglich
if (empty($row['published_at'])) {
'published_at' => $row['published_at'],
} else {
'published_at' => Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['published_at'])),
}
Es gibt Fehler syntax error, unexpected 'if' (T_IF), expecting ']'
Fügen Sie es in eine temporäre Variable ein
Was meinst du mit "temporäre Variable"?
Ich habe eine akzeptable Lösung gefunden
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,
]);
}
}
Hilfreichster Kommentar
So erhalten Sie Carbon, wenn die Datumsspalte als Datum formatiert ist:
Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))