cari

Rumah  >  Soal Jawab  >  teks badan

Cara melaksanakan tugas tersuai atau peristiwa pencetus apabila mengimport fail xlsx melalui laravel excel

Saya baru mengenali Laravel, Saya ingin memasukkan butiran pelajar dari fail xlsx ke dalam pangkalan data mysql. Saya menggunakan Laravel excel v3 untuk mengimport fail excel. Ia berfungsi dengan baik. Walau bagaimanapun, selain daripada memasukkan butiran pelajar dalam 1 jadual, rekod ID pelajar yang sama harus dibuat dalam semua jadual yang berkaitan.

Contoh--> Jika anda memasukkan 1 pelajar dalam jadual "student_details", anda mesti mencipta 1 rekod dalam jadual "oral" dan "endsem" dengan kunci asing "student_id".

Saya telah menjalankan aktiviti untuk merekodkannya dalam helaian lisan dan helaian akhir. Sekarang persoalannya ialah cara menggunakan acara dan cara mendapatkan ID pelajar selepas mencipta pelajar untuk mencetuskan acara. (ID Pelajar akan menjadi nilai auto_increment)

Import Pelajar -->

<?php
namespace App\Imports;

use App\Events\StudentCreated;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Validators\Failure;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\SkipsOnFailure;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\SkipsFailures;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use App\Models\StudentDetails;

class StudentsImport implements ToModel, SkipsOnFailure, WithValidation, WithHeadingRow
{
    use Importable, SkipsFailures;

    /**
    * @param Collection $collection
    */
    public function model(array $row)
   {     
        return new StudentDetails([
            'roll_no' => $row['roll_no'],
            'student_id' => $row['student_id'],
            'div' => $row['div'],
            'name' => $row['name'],
            'gender' => $row['gender'],
            'user_key' => session()->get('user_id'),
            'group_key' => $group_key
        ]);
    }

    public function onFailure(Failure ...$failures)
    {
        // Handle the failures how you'd like.
    }

    public function rules(): array
    {

        return [
            'student_id'  =>[
                'required',
                'string',
                'unique:student_details'
            ],
            'roll_no' =>[
                'required',
                'integer'
            ],
            'name' => [
                'required',
                'string',
            ]

        ];
    }

}

Matlamat utama saya adalah untuk memasukkan rekod pelajar ke dalam semua jadual berkaitan dengan kunci asing "id_pelajar" apabila pelajar dimasukkan ke dalam jadual "butiran_pelajar". Jika ada cara lain, tolong bantu.

P粉312195700P粉312195700230 hari yang lalu444

membalas semua(1)saya akan balas

  • P粉395056196

    P粉3950561962024-03-29 00:08:31

    Daripada menggunakan MaatwebsiteExcelConcernsToModel 您可以使用 MaatwebsiteExcelConcernsOnEachRow. Anda mempunyai lebih kawalan ke atas perkara yang berlaku pada setiap baris.

    use App\StudentDetails;
    use Maatwebsite\Excel\Row;
    use Maatwebsite\Excel\Concerns\OnEachRow;
    
    class StudentsImport implements OnEachRow, ...
    {
        public function onRow(Row $row)
        {
            $rowIndex = $row->getIndex(); 
            $row = $row->toArray();
            // create model
            $studentDetails = StudentDetails::create([
                'roll_no' => $row['roll_no'],
                'student_id' => $row['student_id'],
                'div' => $row['div'],
                'name' => $row['name'],
                'gender' => $row['gender'],
                'user_key' => session()->get('user_id'),
                'group_key' => $group_key /* this variable doesn't seem to be defined anywhere */
            ]);
            // create related models
            $studentDetails->oral()->create([...]);
            $studentDetails->endsem()->create([...]);
        }
    }
    

    Adapun untuk mewujudkannya dalam urusan:

    DB::transaction(fn () => (new StudentsImport)->import(...));
    

    balas
    0
  • Batalbalas