Laravel-excel: [اقتراح] استيراد العناصر دون حفظ مباشرة

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

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

إصدارات

  • إصدار PHP: 7.1.9
  • إصدار Laravel: 5.7.19
  • إصدار الحزمة: 3.0+

وصف

يجب أن يكون استيراد النماذج ممكنًا دون حفظها مباشرةً. يجب أن يكون من الممكن أيضًا إرجاع أي شيء بخلاف النماذج من الاستيراد.

لا يمكنني حاليًا الترقية من 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 لاستيراد الفئات ، والتي يمكنها إرجاع أي نوع بدلاً من النماذج فقط.

question

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

WouterFlorijn يمكنك تجربة هذه

$array = Excel::toArray([], 'file.xlsx');

ال 9 كومينتر

يعد استخدام 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 :

  1. تقوم بإرجاع مجموعة مع عنصر واحد ، وهي مجموعة أخرى تحتوي على مجموعة لكل صف.
  2. يتطلب الأمر وسيطة استيراد ، وهي غير مجدية في الحالات التي تريد فيها فقط إرجاع الصفوف كمجموعات.

ما أبحث عنه ببساطة هو طريقة تُرجع مجموعة من النماذج ، دون حفظها. لا أريد معالجة الصفوف الموجودة في وحدة التحكم الخاصة بي ، أود القيام بذلك في فئة استيراد. حتى الآن لم أجد هذا.

ربما تكون هذه المستندات مفيدة لك:
التعامل مع المثابرة بنفسك
مفاهيم العمارة

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');
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

kurianic picture kurianic  ·  3تعليقات

rossjcooper picture rossjcooper  ·  3تعليقات

vandolphreyes picture vandolphreyes  ·  3تعليقات

lucatamtam picture lucatamtam  ·  3تعليقات

contifico picture contifico  ·  3تعليقات