2
votes

Comment mettre à jour les données dans la base de données à l'aide d'import Excel

comment mettre à jour les données dans la base de données avec import Excel. j'utilise laravel 5.7 et maatwebsite 3.1

c'est mon contrôleur:

array:1 [â–¼
   0 => array:8 [â–¼
      0 => array:3 [â–¼
         "id" => 1.0
         "produk" => "Pomade"
         "harga" => 90000.0
      ]
      1 => array:3 [â–¼
         "id" => 2.0
         "produk" => "Shampoo"
         "harga" => 90000.0
      ]
      2 => array:3 [â–¼
         "id" => 3.0
         "produk" => "Sikat WC"
         "harga" => 90000.0
      ]
    ]
]

Ceci est ma classe d'importation:

<?php

 namespace App\Imports;

 use App\Produk;
 use Maatwebsite\Excel\Concerns\ToModel;
 use Maatwebsite\Excel\Concerns\WithHeadingRow;


 class ProdukImport implements ToModel, WithHeadingRow
 {
    /**
     * @param array $row
     *
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function model(array $row)
    {
       return new Produk([
          'id_produk' => $row['id'],
          'nama_produk' => $row['produk'],
          'harga_jual' => $row['harga']
       ]);
     }
  }

ce résultat dd ($ data):

public function import()
{
   $data = Excel::toArray(new ProdukImport, request()->file('file')); 
   if ($data) {
       DB::table('produk')
            ->where('id_produk', $data['id'])
            ->update($data);
   }
}

le résultat $ data provient de ceci: $ data = Excel :: toArray (new ProdukImport, request () -> file ('file'));


6 commentaires

Quelle est la sortie de dd($data) ?


tableau: 1 [▼ 0 => tableau: 8 [▼ 0 => tableau: 3 [▼ "id" => 1.0 "produk" => "Pomade" "harga" => 90000.0] 1 => tableau: 3 [▶ ] 2 => tableau: 3 [▶] 3 => tableau: 3 [▶] 4 => tableau: 3 [▶] 5 => tableau: 3 [▶] 6 => tableau: 3 [▶] 7 => tableau : 3 [▶]]]


Pourriez-vous modifier votre question initiale et ajouter le résultat?


ok, j'ai mis à jour ma question


Ajout de ma réponse, faites-nous savoir si cela fonctionne pour vous.


Je l'ai essayé et j'ai eu cette erreur: SQLSTATE [42S22]: [Microsoft] [Pilote ODBC 11 pour SQL Server] [SQL Server] Nom de colonne non valide «id». (SQL: update [produk] set [id] = 1, [produk] = Pomade, [harga] = 90000 où [id_produk] = 1) dans mon fichier Excel, tableau d'en-tête comme celui-ci: Id | Produk | Harga et dans ma base de données la table comme ceci: id_produk | nama_produk | harga_jual. Il y a quelque chose qui ne va pas dans ma table d'en-tête dans le fichier Excel?


3 Réponses :


-1
votes

Voici une fonction simple pour insérer des données sur db à l'aide d'un fichier Excel.

 public function importData(Request $request){
    if($request->hasFile('sample_file')){
        $path = $request->file('sample_file')->getRealPath();
        $data = \Excel::load($path)->get();
        if($data->count()){
            foreach ($data as $key => $value) {
                $arr[] = ['name' => $value->name, 'details' => $value->details];
            }
            if(!empty($arr)){
                \DB::table('table_name')->insert($arr);
                dd('Insert Record successfully.');
            }
        }
    }


6 commentaires

Ce n'est pas ce que veut OP.


@Rahmat ce que vous obtenez dans $data ?


@Javed je n'obtiens rien dans $ data


qu'est-ce que vous obtenez dans $request ?


@Javed même, mais quand $ data utilise comme ça $ data = Excel :: toArray (new ProdukImport, request () -> file ('file')); j'ai des données dans le tableau: array: 1 [▼ 0 => array: 8 [▼ 0 => array: 3 [▼ "id" => 1.0 "produk" => "Pomade" "harga" => 90000.0] 1 = > tableau: 3 [▶] 2 => tableau: 3 [▶] 3 => tableau: 3 [▶] 4 => tableau: 3 [▶] 5 => tableau: 3 [▶] 6 => tableau: 3 [ ▶] 7 => tableau: 3 [▶]]]


Pouvez-vous expliquer pourquoi vous pensez que cela résout le problème? Ajoutez une telle explication à la réponse elle-même afin que les autres puissent apprendre de votre réponse



3
votes

En fonction de la structure de votre tableau $data , vous pourriez probablement obtenir ce que vous voulez avec quelque chose comme ceci:

public function import()
{
    $data = Excel::toArray(new ProdukImport, request()->file('file')); 

    return collect(head($data))
        ->each(function ($row, $key) {
            DB::table('produk')
                ->where('id_produk', $row['id'])
                ->update(array_except($row, ['id']));
        });
}


4 commentaires

Je l'ai essayé et j'ai eu cette erreur: SQLSTATE [42S22]: [Microsoft] [Pilote ODBC 11 pour SQL Server] [SQL Server] Nom de colonne non valide «id». (SQL: update [produk] set [id] = 1, [produk] = Pomade, [harga] = 90000 où [id_produk] = 1) dans mon fichier Excel, tableau d'en-tête comme celui-ci: Id | Produk | Harga et dans ma base de données la table comme ceci: id_produk | nama_produk | harga_jual. Il y a quelque chose qui ne va pas dans ma table d'en-tête dans le fichier Excel?


J'ai modifié ma réponse, mais je suis confus. Avez-vous un champ appelé id dans produk ?


dans ma base de données, j'utilise id_produk dans la table produk. Et dans mon fichier Excel d'en-tête, j'utilise l'identifiant


Je comprends. Je pense que la réponse mise à jour devrait faire l'affaire. Laisse moi savoir si ça fonctionne :)



0
votes

J'ai eu le même problème. Voici comment je l'ai fait.

Ma manette ressemble à ceci:

public function model(array $row)
    {
        $product = new Product();
// row[0] is the ID
        $product = $product->find($row[0]);
// if product exists and the value also exists
        if ($product and $row[3]){
            $product->update([
                'price'=>$row[3]
            ]);
            return $product;
        }
    }

Et c'est la méthode du model sur ma classe ProductImport

public function import(Request $request){
        try {

            Excel::import(new ProductImport, $request->file('file')->store('temp') );
            return redirect()->back()->with('response','Data was imported successfully!');
        } catch (\Exception $exception){
            return redirect()->back()->withErrors(["msq"=>$exception->getMessage()]);
        }

    }


0 commentaires