Maison  >  Questions et réponses  >  le corps du texte

Comment effectuer une tâche personnalisée ou déclencher un événement lors de l'importation d'un fichier xlsx via Laravel Excel

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粉312195700P粉312195700178 Il y a quelques jours383

répondre à tous(1)je répondrai

  • P粉395056196

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

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

    répondre
    0
  • Annulerrépondre