Comment effectuer une tâche personnalisée ou déclencher un événement lors de l'importation d'un fichier xlsx via Laravel Excel
P粉312195700
P粉312195700 2024-03-28 18:53:50
0
1
462

Je suis nouveau sur Laravel, Je souhaite insérer les détails de l'étudiant du fichier xlsx dans la base de données MySQL. J'utilise Laravel Excel v3 pour importer des fichiers Excel. Ça fonctionne bien. Cependant, outre l'insertion des détails de l'étudiant dans une table, le même dossier d'identification d'étudiant doit être créé dans toutes les tables associées.

Exemple--> Si vous insérez 1 étudiant dans la table "student_details", vous devez créer 1 enregistrement dans les tables "oral" et "endsem" avec la clé étrangère "student_id".

J'ai organisé des activités pour les enregistrer dans la fiche verbale et la fiche finale. La question est maintenant de savoir comment appliquer l'événement et comment obtenir la carte d'étudiant après avoir créé l'étudiant pour déclencher l'événement. (L'identifiant de l'étudiant sera la valeur auto_increment)

StudentImport --->

<?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',
            ]

        ];
    }

}

Mon objectif principal est d'insérer le dossier de l'étudiant dans toutes les tables associées avec la clé étrangère "student_id" lorsque l'étudiant est inséré dans la table "student_details". S'il existe un autre moyen, aidez-moi.

P粉312195700
P粉312195700

répondre à tous(1)
P粉395056196

Au lieu d'utiliser MaatwebsiteExcelConcernsToModel 您可以使用 MaatwebsiteExcelConcernsOnEachRow. Vous avez plus de contrôle sur ce qui se passe sur chaque ligne.

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([...]);
    }
}

Quant à la concrétisation des affaires :

DB::transaction(fn () => (new StudentsImport)->import(...));
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal