يجب أن يكون استيراد النماذج ممكنًا دون حفظها مباشرةً. يجب أن يكون من الممكن أيضًا إرجاع أي شيء بخلاف النماذج من الاستيراد.
لا يمكنني حاليًا الترقية من 2.1.30 إلى 3.0.0 أو أعلى. أحتاج إلى أن أكون قادرًا على استيراد مجموعة من النماذج دون حفظها. أنا استخدم هذا للاختبارات. أيضًا ، لدي اختبار حيث يحتوي الصف على معلومات لإنشاء نموذجين مرتبطين (من فئات مختلفة). حاليًا ، يمكنني الحصول على طراز واحد فقط لكل صف. إعادة هيكلة ملف CSV غير ممكن هنا.
يركز IMO، 3.0.0+ بشدة على الموقف المثالي حيث يتوافق ملف CSV واحد مع جدول واحد ، بينما يتوافق صف واحد مع نموذج واحد ، ويجب حفظ كل نموذج على الفور. لم يكن هذا هو الحال بالنسبة لـ 2.X ، ولا أعرف سبب تغييره.
لاحظ أنني لا أريد البقاء في 2.1.30 ، لأنه يتطلب الحزمة المهجورة phpoffice/phpexcel
.
يجب إضافة طريقة إضافية إلى الواجهة Excel
، والتي لها نفس توقيع import
، لكنها تُرجع النماذج بدلاً من حفظها. مثال:
$users = Excel::load(new UsersImport, 'users.xlsx');
بالإضافة إلى ذلك ، يجب إضافة طريقة item
لاستيراد الفئات ، والتي يمكنها إرجاع أي نوع بدلاً من النماذج فقط.
يعد استخدام ToModel
طريقة واحدة فقط للتعامل مع الواردات. هذا هو الخيار الوحيد الذي يجعل إدراج نموذج واحد لكل صف أسهل.
إذا كنت تريد التعامل مع هياكل مختلفة وبطريقة تشبه الإصدار 2.1 ، فأنت بحاجة إلى استخدام ToCollection
: https://laravel-excel.maatwebsite.nl/3.1/imports/collection.html In طريقة التجميع تحصل على مجموعة مماثلة من الصفوف التي حصلت عليها في 2.1.
إذا كنت تريد الحصول على النماذج فقط في وحدة التحكم وليس في كائن الاستيراد (ليس أسلوبًا موصى به حقًا) فهناك طريقة ::toCollection
، والتي تُعيد الصف الخام (لم يتم إجراء أي تحويل إلى النماذج) إلى وحدة التحكم الخاصة بك .
(https://laravel-excel.maatwebsite.nl/3.1/imports/basics.html#importing-to-array-or-collection)
$users = Excel::toCollection(new UsersImport, 'users.xlsx');
patrickbrouwers شكرا Excel::import
على استيراد يقوم بتنفيذ ToCollection
سيعيد مجموعة من النماذج دون حفظها؟ إذا كان الأمر كذلك ، فهذا غير مذكور بوضوح في الوثائق ، مثل المثال الموجود أسفل https://laravel-excel.maatwebsite.nl/3.1/imports/collection.html كما يلي:
public function import()
{
Excel::import(new UsersImport, 'users.xlsx');
}
لا يتم تخزين قيمة الإرجاع في أي مكان ، مما يعني أنه يتم حفظ مجموعة النماذج المستوردة مباشرة (أو على الأقل أن الطريقة لها آثار جانبية). وإلا فسيكون من غير المجدي استدعاء import
بدون تعيين قيمة الإرجاع إلى متغير ، أليس كذلك؟
WouterFlorijn لا ، لن ::import()
أبدًا أي صفوف أو نماذج. فقط Excel::toCollection()
يفعل.
يعد استخدام المشكلة ToCollection
شيئًا مختلفًا عن استخدام Excel::toCollection()
.
عند تنفيذ ToCollection
، يتم تغليف الاستيراد بالكامل داخل كائن الاستيراد. لن يتم إرجاع شيء ما في ToCollection
إلى وحدة التحكم.
patrickbrouwers فقط للعودة ، ما زلت أعتقد أننا نسيء فهم بعضنا البعض. ما أبحث عنه ببساطة هو طريقة تُرجع مجموعة من النماذج ، دون حفظها. لا أريد معالجة الصفوف الموجودة في وحدة التحكم الخاصة بي ، أود القيام بذلك في فئة استيراد. حتى الآن لم أجد هذا.
الفكرة:
المعاملاتImport.php:
<?php
namespace App\Imports;
use App\Banks\Transaction;
use Carbon\Carbon;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class TransactionsImport implements ToModel, WithHeadingRow
{
public function model(array $row)
{
$transaction = new Transaction;
$transaction->amount = $row['amount'];
$transaction->currency = $row['currency'];
return $transaction;
}
}
TransactionsController.php:
...
$transactions = Excel::someFunction(new TransactionsImport, 'path/to/file.csv');
// $transactions is a Collection of Transaction models that are not saved to the database yet.
...
لقد وجدت أيضًا مشكلتين في وظيفة toCollection
:
ما أبحث عنه ببساطة هو طريقة تُرجع مجموعة من النماذج ، دون حفظها. لا أريد معالجة الصفوف الموجودة في وحدة التحكم الخاصة بي ، أود القيام بذلك في فئة استيراد. حتى الآن لم أجد هذا.
ربما تكون هذه المستندات مفيدة لك:
التعامل مع المثابرة بنفسك
مفاهيم العمارة
WouterFlorijn يمكنك تجربة هذه
$array = Excel::toArray([], 'file.xlsx');
WouterFlorijn يمكنك تجربة هذه
$array = Excel::toArray([], 'file.xlsx');
هذا بالضبط ما كنت أبحث عنه.
+1 لهذا الطلب. لا أعتقد أن أساليب النموذج () والتجميع () يجب أن تحفظ أي شيء. يجب أن تعيد البيانات من ملف Excel / CSV إلى مجموعة (أو صفيف) من النماذج / المصفوفات. يجب التعامل مع المثابرة بشكل منفصل ، أو على الأقل اختيار.
حالة الاستخدام الخاصة بي: أريد الحصول على الحد الأدنى والحد الأقصى للتاريخ من السجلات في ملف CSV. إذا تداخل هذا مع ملف CSV تم استيراده حاليًا ، فلا يجب استيراد أي شيء قبل أن يؤكد المستخدم صحة التداخل.
تحرير: آه ، أنا أستجيب لقضية مغلقة. كيف تعاملت مع هذاWouterFlorijn؟
يمكنك تحقيق ذلك بنفسك بسهولة عن طريق الاحتفاظ بالحالة داخل فئة الاستيراد ، ويمكنك إنهاء طريقة toModels
داخل سمة وإعادة استخدامها في جميع عمليات التصدير الخاصة بك.
new UsersImport implements ToModel, WithHeadingRow
{
use Importable;
protected array $models;
public function model(array $row)
{
$this->models[] = new User($row);
}
public toModels(string $filename): array
{
$this->import($filename);
return $this->models;
}
}
$nonPersistedUsers = (new UsersImport)->toModels('users.xlsx');
التعليق الأكثر فائدة
WouterFlorijn يمكنك تجربة هذه
$array = Excel::toArray([], 'file.xlsx');